הדפסת ד''וח מאקסס על בסיס קובץ וורד
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל אני לא מבין את התחביר של השאילתא:
SELECT qrySelect_currentID.Data.ID, qrySelect_currentID.Data.FirstName, qrySelect_currentID.Data.LastName, INTO MailMerge FROM qrySelect_currentID;
- איך יתכן שתי נקודות בשם שדה
qrySelect_currentID.Data.ID
, האם אתה משתמש בשדה עם ערכים מרובים? - אחרי
LastName
יש פסיק מיותר
האמת לא עשיתי את התחביר חבד אלא השתמשתי במעצב השאילתות ומשום מה ככה זה יצא (אולי בגלל שערכתי שאילתת קיבוץ קיימת והפכתי אותו ליצירת טבלה). הפסיק זה טעות שלי, (יש עוד שדות בהמשך שהשתמטתי בהעלאה לפורום...)
בכל אופן יצרתי אותו מחדש ועדיין אותו בעיה, ידנית זה עובד ומהקוד אני מקבל שגיאה כנ"ל.
SELECT qrySelect_currentID.ID, qrySelect_currentID.FirstName, qrySelect_currentID.LastName INTO MailMerge FROM qrySelect_currentID
ניסיתי גם לקחת ישירות מטבלת הנתונים:
SELECT Data.ID, Data.FirstName, Data.LastName INTO MailMerge FROM Data WHERE (((Data.ID)=[Forms]![frmData]![ID]));
- איך יתכן שתי נקודות בשם שדה
-
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
מה התחביר של qryUpdate_Data?
יש לי טופס שאני ממלא בו פרטים
וזה שאילתת עדכון שממלא חישובים לתוך שדות נוספים בטבלת הDATA
לדוגמה מחשב גיל לפי תאריך לידה, וממיר את תאריך הלידה לטקסט.UPDATE Data SET Data.DobT = Format([dob],"dd/mm/yy"), Data.Age = IIf([age] Is Null,DateDiff("yyyy",[Dob],Now())+Int(Format(Now(),"mmdd")<Format([Dob],"mmdd")),[age]);
אני צריך לפני ההדפסה שיעדכן את טבלת הנתונים במקום שאחשב אותם לבד במילוי הטופס.
גם כשאני מוחק את הכל מה-VBA ומשאיר רק את יצירת הטבלה הוא עושה בעיות.Private Sub cmdPrint_Click() CurrentDb.Execute "qryMake_MailMerge" End Sub
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
אגב: סליחה על הדיליי בתגובה
סליחה???
אני זה שצריך לבקש... -
@בערל אוקי. הניחוש שלי הוא שהטבלה MailMerge לא מספיקה להימחק לפני שאתה מנסה לבנות אותה מחדש. זה בגלל שיש השהייה בקריאה ל:
"DoCmd.DeleteObject acTable, "MailMerge
. ככה זה באקסס.תוסיף את שתי הפונקציות השימושיות הבאות למודל חדש:
Public Function TableExist(TableName As String) As Boolean TableExist = Not IsNull(DLookup("Name", "MSysObjects", "Name='" & TableName & "'")) End Function Public Sub TableDelete(TableName As String) If TableExist(TableName) Then CurrentDb.TableDefs.Delete (TableName) End Sub
ובקוד של הלחצן תמחק את הטבלה כך:
TableDelete "MailMerge" CurrentDb.Execute "qryMake_MailMerge"
-
@בערל אני חושב שהבנתי הפעם.
השגיאה הנ"ל פירושה ששדה מסויים בשאילתא לא נמצא.
כאשר אתה רוצה לקחת שדה מתוך טופס, הכל טוב ויפה כל עוד הדברים נשארים בתוך השאילתא.
אבל אם רוצים להריץ על ידי Execute שאילתא שמשתמשת בנתון מתוך טופס, זה גורם בעייה תחבירית, כי שם השדה[Forms]![frmData]![ID]
לא תקין.מה שאתה צריך לעשות הוא לחשב את הערך ואחר כך להכניס אותו לתחביר ה-SQL. כך:
TabeDelete "MailMerge" Dim SQL as String SQL = "SELECT Data.ID, Data.FirstName, Data.LastName " _ & "INTO MailMerge " _ & "FROM Data " _ & "WHERE (Data.ID = " & Me.ID & ");" CurrentDb.Execute SQL
הערה:
יש דרך יותר אלגנטית ותקנית לעשות את זה, על ידי העברת פרמטר לשאילתא, כך שתחביר השאילתא לא מופיע ישירות בקוד, אלא בשאילתא רגילה, דהיינו בתוךqryMake_MailMerge
.
אם אכן כיוונתי לפתרון, אני אדריך אותך איך לעשות את זה. -
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל אני חושב שהבנתי הפעם.
השגיאה הנ"ל פירושה ששדה מסויים בשאילתא לא נמצא.
כאשר אתה רוצה לקחת שדה מתוך טופס, הכל טוב ויפה כל עוד הדברים נשארים בתוך השאילתא.
אבל אם רוצים להריץ על ידי Execute שאילתא שמשתמשת בנתון מתוך טופס, זה גורם בעייה תחבירית, כי שם השדה[Forms]![frmData]![ID]
לא תקין.מה שאתה צריך לעשות הוא לחשב את הערך ואחר כך להכניס אותו לתחביר ה-SQL. כך:
TabeDelete "MailMerge" Dim SQL as String SQL = "SELECT Data.ID, Data.FirstName, Data.LastName " _ & "INTO MailMerge " _ & "FROM Data " _ & "WHERE (Data.ID = " & Me.ID & ");" CurrentDb.Execute SQL
ת
עובד מעולה!!!
תודה ענקית על הכל! -
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
הערה:
יש דרך יותר אלגנטית ותקנית לעשות את זה, על ידי העברת פרמטר לשאילתא, כך שתחביר השאילתא לא מופיע ישירות בקוד, אלא בשאילתא רגילה, דהיינו בתוךqryMake_MailMerge
.
אם אכן כיוונתי לפתרון, אני אדריך אותך איך לעשות את זה.לא אכפת לי שזה רץ מתוך VBA, אני לא זקוק לשאילתא לבד.
אבל מעניין אותי לשמוע כשיש לך זמן... -
@בערל כעת עלה לי רעיון הרבה יותר פשוט, שלא מצריך טבלת עזר כלל: פשוט נשנה ישירות את תחביר השאילתה של המיזוג.
- צור שאילתא qryMailMerge. (לא משנה מה התחביר שלה כרגע, אנו נשנה זאת מיד). ובמיזוג דואר תבחר אותה כמקור הנתונים.
- בקוד הלחצן:
DoCmd.RunCommand (acCmdSaveRecord) CurrentDb.Execute "qryUpdate_Data", dbFailOnError Dim SQL as String SQL = "SELECT Data.ID, Data.FirstName, Data.LastName " _ & "FROM Data " _ & "WHERE (Data.ID = " & Me.ID & ");" CurrentDb.QueryDefs("qryMailMerge").SQL = SQL DoCmd.GoToRecord , , acNext RunMailMerge "C:\Users\.....TEMPLATE.docx", "C:\Users......pdf", True
זהו. שורה 8 משנה את השאילתה כך שתציג את הנתונים הרלוונטים.
זה גם עדיף למקרה שבו שינית את הנתונים ולא לחצת על הכפתור, הם יתעדכנו בוורד בכל מקרה.
אמנם כך התחמקתי מלהסביר על שאילתת פרמטר, אבל עוד חזון למועד... -
@odeddvir אמר בהדפסת ד''וח מאקסס על בסיס קובץ וורד:
@בערל כעת עלה לי רעיון הרבה יותר פשוט, שלא מצריך טבלת עזר כלל: פשוט נשנה ישירות את תחביר השאילתה של המיזוג.
- צור שאילתא qryMailMerge. (לא משנה מה התחביר שלה כרגע, אנו נשנה זאת מיד). ובמיזוג דואר תבחר אותה כמקור הנתונים.
- בקוד הלחצן:
DoCmd.RunCommand (acCmdSaveRecord) CurrentDb.Execute "qryUpdate_Data", dbFailOnError Dim SQL as String SQL = "SELECT Data.ID, Data.FirstName, Data.LastName " _ & "FROM Data " _ & "WHERE (Data.ID = " & Me.ID & ");" CurrentDb.QueryDefs("qryMailMerge").SQL = SQL DoCmd.GoToRecord , , acNext RunMailMerge "C:\Users\.....TEMPLATE.docx", "C:\Users......pdf", True
זהו. שורה 8 משנה את השאילתה כך שתציג את הנתונים הרלוונטים.
זה גם עדיף למקרה שבו שינית את הנתונים ולא לחצת על הכפתור, הם יתעדכנו בוורד בכל מקרה.
אמנם כך התחמקתי מלהסביר על שאילתת פרמטר, אבל עוד חזון למועד...גאוני!
עובד פנטסטי
תודה על הכל!
-
-
-
-
-
-
-