דילוג לתוכן

תכנות

4.6k נושאים 38.2k פוסטים

קטגוריות משנה


  • 22 נושאים
    137 פוסטים
    katzK

    שלום לכולם
    התבקשתי רבות מחברים פיתרון לבעיה הידועה לבצע מיזוג דואר, אך לשמור קובץ PDF נפרד לכל רשומה, עם שם מותאם אישית.

    אפרט כאן במדריך שלב אחר שלב איך לבצע זאת, תהיו איתי עד הסוף מקווה שתהנו...

    נתחיל...

    שלב א:

    ראשית בקובץ ה- Excel של רשימת הנמענים, הוסיפו לטבלת הנתונים ארבעה עמודות בשמות כדלהלן (חשוב שהשמות יהיו מדויקים ללא רווחים מיותרים - לתשומת ליבכם):

    DocFolderPath

    DocFileName

    PdfFolderPath

    PdfFileName

    שלב ב:
    צרו שתי תיקיות נפרדות, אחד לקבצי הפלט בפורמט docx, ואחד לקבצי הקלט בפורמט pdf, העתיקו את נתיב התיקייה של קבצי ה- docx והדביקו אותם עבור כל רשומה בשדה שיצרתם בשם DocFolderPath, לאחמ"כ חזרו על הפעולה והפעם העתיקו את נתיב התיקייה של קובצי ה- PDF והדביקו בשדה PdfFolderPath.
    בשדה DocFileName כתבו את השם של הקובץ עבור הרשומה - ניתן להשתמש בנוסחאות, כמו"כ בשדה PdfFileName כתבו את שם הקובץ כנ"ל.

    שלב ג:
    פתחו את קובץ ה- word והשלימו את פעולת המיזוג כרגיל, עצבו את המסמך כרצונכם.

    שלב ד:
    פתחו את לשונית מפתחים בקובץ ה- word פתחו את עורך הקוד הוסיפו מודל חדש מצו"ב צילום מסך:
    3eb2538f-9ab1-41eb-a1df-452212916da6-image.png

    הדביקו את הקוד הבא:

    Sub MailMergeToPdfBasic() ' Mark the start of the Subroutine (i.e. Macro) and name it "MailMergeToPdf" ' Macro created by Imnoss Ltd ' Please share freely while retaining attribution ' Last Updated 2021-05-03 Dim masterDoc As Document, singleDoc As Document, lastRecordNum As Long ' Create variables ("Post-it Notes") for later use Set masterDoc = ActiveDocument ' Identify the ActiveDocument (foremost doc when Macro run) as "masterDoc" masterDoc.MailMerge.DataSource.ActiveRecord = wdLastRecord ' jump to the last active record (active = ticked in edit recipients) lastRecordNum = masterDoc.MailMerge.DataSource.ActiveRecord ' retrieve the record number of the last active record so we know when to stop masterDoc.MailMerge.DataSource.ActiveRecord = wdFirstRecord ' jump to the first active record (active = ticked in edit recipients) Do While lastRecordNum > 0 ' create a loop, lastRecordNum is used to end the loop by setting to zero (see below) masterDoc.MailMerge.Destination = wdSendToNewDocument ' Identify that we are creating a word docx (and no e.g. an email) masterDoc.MailMerge.DataSource.FirstRecord = masterDoc.MailMerge.DataSource.ActiveRecord ' Limit the selection to just one document by setting the start ... masterDoc.MailMerge.DataSource.LastRecord = masterDoc.MailMerge.DataSource.ActiveRecord ' ... and end points to the active record masterDoc.MailMerge.Execute False ' run the MailMerge based on the above settings (i.e. for one record) Set singleDoc = ActiveDocument ' Identify the ActiveDocument (foremost doc after running the MailMerge) as "singleDoc" singleDoc.SaveAs2 _ FileName:=masterDoc.MailMerge.DataSource.DataFields("DocFolderPath").Value & Application.PathSeparator & _ masterDoc.MailMerge.DataSource.DataFields("DocFileName").Value & ".docx", _ FileFormat:=wdFormatXMLDocument ' Save "singleDoc" as a word docx with the details provided in the DocFolderPath and DocFileName fields in the MailMerge data singleDoc.ExportAsFixedFormat _ OutputFileName:=masterDoc.MailMerge.DataSource.DataFields("PdfFolderPath").Value & Application.PathSeparator & _ masterDoc.MailMerge.DataSource.DataFields("PdfFileName").Value & ".pdf", _ ExportFormat:=wdExportFormatPDF ' Export "singleDoc" as a PDF with the details provided in the PdfFolderPath and PdfFileName fields in the MailMerge data singleDoc.Close False ' Close "singleDoc", the variable "singleDoc" can now be used for the next record when created If masterDoc.MailMerge.DataSource.ActiveRecord >= lastRecordNum Then ' test if we have just created a document for the last record lastRecordNum = 0 ' if so we set lastRecordNum to zero to indicate that the loop should end Else masterDoc.MailMerge.DataSource.ActiveRecord = wdNextRecord ' otherwise go to the next active record End If Loop ' loop back to the Do start End Sub ' Mark the end of the Subroutine

    שלב ה וסיום:
    סגרו את עורך הקוד.
    לחצו על כפתור פקודות מאקרו שבכרטיסיית מפתחים, בחרו את המאקרו בשם MailMergeToPdfBasic ולחצו הפעל מצו"ב צילום מסך
    3890ce69-c0e9-4f30-89ce-3e97b7de750b-image.png

    כעת שבו בנחת והמתינו עד ליצירת כל הקבצים, להנאתכם תפתחו את תיקיות הפלט שיצרתם וגלו שהיא מלאה קבצים קובץ לכל רשומה בשם המתאים שהגדרתם לה.

    מקור

  • ארכיון האתר הקודם והחביב קוד-613

    1k נושאים
    10k פוסטים
    chagoldC

    @אבי אמר בשוב, צילומי הצ'קים בבנקים:

    התעסקתי לאחרונה עם סורקים של חברת MAGTEK, הם ידידותיים ונוחים להתממשקות, אבל כמדומני שהבנקים בישראל מוכנים לקבל סריקות רק מסורקים של חברת PANINI

    @אבי איך יוצרים אתך קשר?

  • 31 נושאים
    133 פוסטים
    Y.Excel.AccessY

    יש כמה נוסחאות חדשות שממש משנות את כללי המשחק בגוגל שיטס:

    CHOOSECOLS לבחירת עמודות ממערך CHOOSEROWS לבחירת שורות ממערך WRAPROWS להמרת מערך חד ממדי לרב ממדי - פריסה לשורות WRAPCOLS כנ"ל - פריסה לעמודות HSTACK ו VSTACK - הפעולה של {} אך בלי סוגריים - לא משמעותי לכאורה

    והעולה על כולנה, סוף סוף:

    LET - ליצירת משתנים.

    כל אלו מצטרפות לפונקציות שנוספו מוקדם יותר -
    https://blog.sheetgo.com/google-sheets-formulas/10-new-google-sheets-functions/

    וכלול בתוכם - LAMBDA, MAP (חלקי - לא עובד לקנן ב MAP ודומיו מערכים אחרים), פונקציות בעלות שם, וכו' ע"ש בקישור.

  • 0 הצבעות
    5 פוסטים
    519 צפיות
    chagoldC

    @dovid אמר בשאילתת עדכון בPOSTGRESSQL לא מחזירה ערך תקין ב-RETURN (שפה PHP):

    @chagold אמר בשאילתת עדכון בPOSTGRESSQL לא מחזירה ערך תקין ב-RETURN (שפה PHP):

    העתקתי את הדוגמא שם, ומשום מה השגיאה נשארת.

    שגיאה? לא דיברת על שגיאה. מה השגיאה?

    א'. טעיתי במינוח שגיאה. התכוונתי למה שכתבתי בפוסט הפותח שהוא לא מחזיר ערך תקין.
    ב' מצאתי את הפתרון, הטעות שלי שניסיתי לקרוא אותו כערך במקום לקרוא אותו כטבלה (עם עמודה ושורה אחת).

  • שליחת קובץ גדול ב WCF

    8
    0 הצבעות
    8 פוסטים
    547 צפיות
    מנצפךמ

    @clickone
    בינתיים זה עזר לי:
    https://stackoverflow.com/a/20667308

  • שאלה ב AngularJS + ui.router

    1
    0 הצבעות
    1 פוסטים
    209 צפיות
    אין תגובות
  • הפרדת דומיין מהURL

    22
    0 הצבעות
    22 פוסטים
    2k צפיות
    WWWW

    @dovid צודק, בקריאה חוזרת, שמתי לב.

    אבל טוב לדעת שאפשר כ"כ לדייק בדבריך ☺

  • שגיאות בתצוגת MVC

    הועבר
    5
    0 הצבעות
    5 פוסטים
    518 צפיות
    dovidD

    לגבי שפת C#
    http://www.underwar.co.il/1-Programming/d104/
    http://webmaster.org.il/articles/csharp

  • עזרה בJS

    3
    0 הצבעות
    3 פוסטים
    465 צפיות
    שואףש

    שכחתי לענות.
    אכן זו בעייה אבטחה, לא חשבתי על זה, וכנראה שאין דרך לעשות את זה.
    אבל מצאתי רעיון אחר מאוד פשוט. אני בודק מה הURL של הדף שטעון בתוך הפריים, וכך אני יודע איפה הוא אוחז ואם הגיע לאן שרציתי
    תודה

  • תקלה בהעלאת פרוייקט לGIT

    6
    0 הצבעות
    6 פוסטים
    515 צפיות
    chagoldC

    תודה רבה!

  • 0 הצבעות
    13 פוסטים
    864 צפיות
    א

    יש מצב שאפי' שבפועל יש לשרת 8 ליבות הוא מגביל את הגישה רק לאחד?
    0_1535029647508_d1ecdacc-4fed-48b0-8be5-cf43b763e35c-image.png

  • עזרה בדחיפת מאגר (פרוייקט) ל-GITLAB

    4
    0 הצבעות
    4 פוסטים
    400 צפיות
    dovidD

    @chagold מצויין, כעת תריץ את הפקודה שרצית.

  • ASP.NET vs ASP.NET MVC

    הועבר
    10
    0 הצבעות
    10 פוסטים
    2k צפיות
    dovidD

    Layout בקצרה:

    בתיקיית Views אם יש קובץ בשם _ViewStart, אז הוא נקרא תמיד לפני כל תצוגה.
    בקובץ הזה יש קוד, שככה הוא נראה בדרך כלל:

    @{ Layout = "~/Views/Shared/_Layout.cshtml"; }

    כיון ששורת קוד מבוצעת עבור כל התצוגות, הרי זה כאילו כתוב את זה בכל תצוגה. זה בעצם מגדיר את נתיב הקובץ _Layout.cshtml למאפיין Layout שההשלכה שלו היא שהדף מבוסס על התבנית של הדף שצויין.
    תצוגה שיש לה Layout לא מרונדרת באופן ישיר: קודם מרונדר קובץ האב, ורק אם-איפה שיש @RenderBody() מוזרק הרינדור של התצוגה עצמה.
    (בתצוגות שנרצה לדרוס התנהגות זו מוסיפים בהתחלה Layout = null וזה מאפס את ההגדרה).

    הבעיה שלי העיקרית שאני לא מצליח להבין עדיין איך אני כותב קוד C# ומה התחביר שמתחבר לכיון התצוגה (מקווה שהסברתי נכון).

    תתחיל ממשהו קטן, נניח תכתוב במתודה אינדקס כזה קוד:

    public ActionResult Index() { ViewData["result"] = 1 + 1; return View(); }

    ובRazor תכתוב איפשהוא

    <strong>result is</strong> @ViewData["result"]

    ותראה את התוצאה.
    להבנת העברת המידע לבקר תכתוב משהו גדול יותר, למשל:

    public ActionResult Calc(int oneNumber, int anotherNumber) { ViewData["result"] = oneNumber * anotherNumber; return View("Index"); }

    בשביל לצפות בתוצאה כתוב בשורת הכתבות נתיב כזה:

    http://localhost:xx/Home/Calc?oneNumber=52&anotherNumber=33

    שים לב שהעברתי למתודה View פרמטר טקסט Index כי רציתי להשתמש בתצוגה של מתודה עם שם שונה, אז לא יכלתי לסמוך על הCoc - מוסכמות.
    הפרמטרים oneNumber anotherNumber של המתודה אינדקס מסופקים אוטומטית ע"י המנוע של MVC, כשהוא מאתר אותם בפרמטרי הכתובת - QueryString. למנגנון התאמת פרמטרי המתודה לערכים המסופקים ע"י הבקשה קוראים Model Binder והוא רחב אפשרויות, הוא קורא ערכים הן מהכתובת הן מפרמטרי הכתובת, והן מגוף הבקשה (body).

    @dovid האם הספר הזה: מדריך ASP.NET MVC 4 מתאים לי להתחלה?

    יש לי אותו ונהנתי ממנו בבחינת "המקסימום שהיה בעברית".

  • עזרה בקריאת מאמץ המחשב

    4
    0 הצבעות
    4 פוסטים
    384 צפיות
    dovidD

    לא יודע בדיוק.
    תחפש באינטרנט proccess vs child proccess
    וזה שונה מthread שזה רמת הפרדה עדינה יותר.

  • שאלה כללית ב WebSocket

    25
    0 הצבעות
    25 פוסטים
    2k צפיות
    א

    @מנצפך אמר בשאלה כללית ב WebSocket:

    https://stackoverflow.com/a/6756431
    כאן יש אפשרות לעשות emit, ואז לחכות להאזין לתשובה שחוזרת.

    Server var io = require('socket.io').listen(80); io.sockets.on('connection', function (socket) { socket.on("getSomeData", function (name, fn) { fn({ data: "some random data" }); }); }); Client < script src = "http://localhost/socket.io/socket.io.js" ></script > <script> var socket = io.connect('http://localhost'); socket.emit("getSomeData", function(data) { console.log(data); }); </script>

    זה בגדול מה שחיפשתי. שימו לב שהקליינט שולח בקשה "getSomeDate", ומקבל את ה data שהוא רוצה.
    פשוט וקל.

    רק להוסיף
    שאפשר גם לשלוח דאטא, רק לדאוג שהארגומנט האחרון יהיה הפונקציה

    var socket = io.connect('http://localhost'); socket.emit("getSomeData", 'this is data', function(data) { console.log(data); });
  • 0 הצבעות
    4 פוסטים
    287 צפיות
    chagoldC

    הצלחתי לזהות את המסדי נתונים XXX בתוכנת heidisql ע"י שאילת sql . זאת אומרת אאין בעיה כל שהיא בהרשאות אלא רק בעיה בגישה.

    SELECT datname FROM pg_database WHERE datistemplate = false;

    אבל, איך אני מגדיר את התוכנה עצמה להציג ולגשת אוטומטית את מסד הנתונים הזה באותה רשימה הראשית של שאר הד"ב?

    תודה רבה.

  • פרוייקט שלם בענן ב-vscode

    2
    0 הצבעות
    2 פוסטים
    273 צפיות
    dovidD

    אפשר עם תוסף SFTP
    אבל אינני יודע איך משתמשים.

  • שינוי רוחב פס ב Digital Ocean

    2
    0 הצבעות
    2 פוסטים
    259 צפיות
    clickoneC

    @מנצפך
    אין לזה משמעות לדעתי.
    אא"כ אתה יוטיוב או משהו דומה

  • 0 הצבעות
    5 פוסטים
    466 צפיות
    P

    אוקיי מצאתי פיתרון פשוט וקל, רושמת פה למקרה שיעזור למישהו
    ה-cronicle לא הריץ את ה-jar ישירות, אלא היה לי shell שהריץ אותו
    ה-abort עצר את ה-shell אבל ה-shell לא עצר את הג'אווה.
    כדי לגרום לג'אווה למות כאשר הshell מת, צריך להריץ את הג'אווה בתוספת הפקודה exec
    לדוגמא: exec java -jar MyProgram.jar
    ואז לא נוצר לג'אווה פרוסס משל עצמו, אלא החיים שלו נכנסים לתוך החיים של הshell
    קרדיט ל:
    http://perfspy.blogspot.com/2015/02/trap-killing-signals-inside-docker.html

  • מושגים בסיסיים בניתובים ל\בתוך שרת

    4
    0 הצבעות
    4 פוסטים
    368 צפיות
    dovidD

    @אהרן אמר במושגים בסיים בניתבים ל\בתוך שרת:

    אני מריץ נוד שמקים שרת

    var http = require('http'); server.listen(8080, "0.0.0.0", function(){})

    זה אומר שנוד נרשם במע' ההפעלה שכל קריאה שנכנסת מבחוץ (כרטיס הרשת) שיעודה פורט 8080 (ע"י כתיבה מפורשת, או ניחוש לפי הפרוטוקול) תשודר לתהליך הנוד.
    עד לכאן הבנתי נכון?

    אכן נרשם במערכת ההפעלה שהאפליקציה הזו צריכה לקבל כל בקשה, לאו דוקא חיצונית, שמופנית לפורט זה. אם היית כותב IP מסויים זה היה מגביל את האזנה לIP מקור מסויים, אבל ארבעה אפסים משמעותם any - לא משנה איזה מקור.

    משמע שהניתוב הפנימי מבוצע רק ע"י הפורט, אז למה משמש כתובת ה-IP?

    הכתובת של נמען דואר מורכבת מארץ עיר רחוב מספר ודירה. מי ששולח לשכן שלו באותו בניין נדרש לציין הכל כרגיל. מספר הדירה משמש לזהות בתוך אותו בניין איזה דייר. זה בדיוק תפקיד הפורט. שר הפרטים עשויים לזהות את הבניין מבין כל בנייני תבל וזה תפקיד הIP החיצוני.
    אבל בניגוד למודל של הדואר, באינטרנט יש אופציה לשלוח לשכן (פורט) באותו המחשב בלי להכיר את כתובתו החיצונית של המחשב, וזה ע"י כתובות loopback - המחשב מנתב אותם חזרה לעצמו. הכתובות האלה הם המרחב של 127.0.0.0/8.
    המילה localhost היא דומיין בדיוק כמו google.com שמתורגמת לכתובת אייפי. רק שבניגוד אליה המחשב לא שואל שירות DNS מה כתובתה הפיזית אלא מתרגם אותה על דעת עצמו ל127.0.0.1.

    לעניין הנוגע איליך, מבחינת אבטחה מקובל ששירותים פנימיים חסומים החוצה בשתי שכבות: א. האזנה מאוגדת לכתובת פנימית (במקום ארבעה אפסים שים 127.0.0.1), ב. הפרוט סגור בחומת אש של מערכת ההפעלה.

  • התקנת postgresql על שרת לוקאלי xampp

    4
    0 הצבעות
    4 פוסטים
    325 צפיות
    chagoldC

    xampp, אבל @dovid הבהיר שזה לא מכונה וירטואלית (זה לא לינוקס), אלא רק מתקין ומנהל של אפאצי, PHP, ו-mysql.

  • בחירת והתקנת שרת לוקאלי

    12
    0 הצבעות
    12 פוסטים
    628 צפיות
    ח

    מדריך שאיתו עבדתי להתקין את זה
    http://masterscripter.co.il/מדריך-התקנת-wamp-בשנת-2017/

  • 0 הצבעות
    6 פוסטים
    560 צפיות
    A

    לא יודע אם זה עוד רלבנטי לך, אבל לתועלת הציבור.
    תתקיני בפרויקט את הSDK הזה: https://aws.amazon.com/sdk-for-net/
    (ישנה שם אפשרות להתקין את זה דרך Nuget)

    הנה מחלקה שמשתמשת בAPI הזה כדי לגבות את הדטה בייסים שלי:

    בהצלחה!

    זה מציג את הקוד לא הכי מושלם..

    using Amazon.S3;
    using Amazon.S3.Transfer;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;

    namespace AwsEmptyApp1
    {
    public class UploadFiles
    {
    string bucket = "";//your backet
    string SubDirectoryInBucket = "";//your directory
    Dictionary<string,string> allFiles = new Dictionary<string, string>(); //fileName, fullPath

    public void Start() { try { //כאן נכתב הקוד שמגבה את הדטה בייסים השונים //אחרי זה רצים בלולאה ויוצרים את מערך השמות שלהם עבור ההלאה foreach (var db in dbNames) { var fileName = ""; var fullPath = ""; allFiles.Add(fileName, fullPath); } //העלאה לאמזון Task.Run(async () => { var isUpload = await UploadFiles(allFiles); }).GetAwaiter().GetResult(); } catch (Exception ex) { // } Console.WriteLine("---- DB Backup succesfuly --- "); } public static async Task<bool> UploadFolder(string pathDirectory) { IAmazonS3 s3Client = new AmazonS3Client(); var transfer = new TransferUtilityUploadDirectoryRequest(); transfer.BucketName = bucket; transfer.KeyPrefix = SubDirectoryInBucket; transfer.Directory = pathDirectory; var transferUtility = new TransferUtility(); //כאן אפשר ליצור מנוי לפונקציה שמציגה את התקדמות ההעלאה //transfer.UploadDirectoryProgressEvent += displayProgressFolder; await transferUtility.UploadDirectoryAsync(transfer); return true; } public static async Task<bool> UploadFiles(Dictionary<string, string> pathFiles) { IAmazonS3 s3Client = new AmazonS3Client(); var transferUtility = new TransferUtility(); foreach (var file in pathFiles) { var req = new TransferUtilityUploadRequest(); req.BucketName = bucket; req.FilePath = file.Value; req.Key = SubDirectoryInBucket + file.Key; //כאן אפשר ליצור מנוי לפונקציה שמציגה את התקדמות ההעלאה //req.UploadProgressEvent += displayProgressFile; await transferUtility.UploadAsync(req); } return true; } }

    }

בא תתחבר לדף היומי!