ABA


"הדפסת דוח ''סלקטיבי'' באקסס"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #6147 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 6147
szargel

   15:48   04.06.03   
אל הפורום  
  הדפסת דוח ''סלקטיבי'' באקסס  
 
   עבר עריכה לאחרונה בתאריך 07.06.03 בשעה 23:05
 
יש לי טבלה המכילה כ20 שדות עבור כל רשומה.
אני רוצה לאפשר למשתמש להדפיס דו"ח טורי שיכיל כל פעם שדות אחרים (המשתמש יסמן בV איזה שדות הוא רוצה שיודפסו).
מישהו יודע איך עושים דבר כזה?

תודה מראש.
עידו.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  נראה לי אתה צריך לעשות טופס hll 07.06.03 23:15 1
     קצת יותר מידע יכול להועיל... szargel 08.06.03 01:45 2
  פתרון faktoraa 08.06.03 11:15 3
     תודה רבה. szargel 08.06.03 13:09 4
         אין בעיה faktoraa 08.06.03 14:48 5
             עוד 2 שאלות. szargel 08.06.03 14:52 6
                 המשך: faktoraa 08.06.03 16:00 9
                     תודה רבה. szargel 08.06.03 16:33 10
         תגובה ל''עריכה'' faktoraa 08.06.03 14:54 7
             תודה רבה. szargel 08.06.03 14:58 8
  שיאללה!! איזה סוס טרויאני!! faktoraa hll 08.06.03 20:20 11

       
hll

   23:15   07.06.03   
אל הפורום  
  1. נראה לי אתה צריך לעשות טופס  
בתגובה להודעה מספר 0
 
   שמפעיל מאקרו...
או שמפעיל משהוא שצריך לרשום במודלים...

זה לא נראה לי משהוא שרכיב הדו"חות יודע לעשות (אם כמובן אתה לא רוצה שהמשתמש ישתמש באשף...)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
szargel

   01:45   08.06.03   
אל הפורום  
  2. קצת יותר מידע יכול להועיל...  
בתגובה להודעה מספר 1
 
   הכיוון נשמע מעניין.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
faktoraa

   11:15   08.06.03   
אל הפורום  
  3. פתרון  
בתגובה להודעה מספר 0
 
   אהלן.

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

בניתי מסד נתונים עם טבלה אחת Table1 ובו 10 שדות בשם Field1 - Field10.
כמו כן ישנו טופס Form1 עם 10 Check boxes (תיבות סימון) בשם chkField1 - chkField10. כמו כן על הטופס ישנו כפתור שפותח את הדוח Report1 - הכפתור נבנה עם האשף של אקסס (אם קיים אשף למטרה כלשהי, אין יותר מדי סיבות לא להשתמש בו, זה חוסך הרבה זמן תכנות מיותר).
הדוח נבנה בצורה טבלאית כאשר יש בה 10 שדות (Field1-Field10) ו10 לייבלים (Label1-Label10).
הרעיון הוא לבדוק כל אחד מתיבות הסימון בטופס ולראות האם הוא מסומן (ערך = -1). אם כן אז צריך להציג ולמקם את השדה הרלוונטי ואם לא אז צריך להסתיר את השדה הרלוונטי, כמובן גם את הלייבלים שלהם בהתאמה.
כמו כן אם צריך להציג שדה מסויים אז גם צריך למקם אותו לאחר השדה האחרון שהוצג + רווח בינהם.
הפונקציה הבאה מבצעת את ההצגה/הסתרה + מיקום הנ"ל:

'This procedure will check if the control needs to be placed and
'where it needs to placed.
'The values passed to the procedure are:
'TheControl - The name of the text box to be placed
'TheControlsLabel - the name of the label for this column
'TheCheckBoxToCheck - the name of the checkbox on the form that builds this report
Private Sub PlaceTheControl(TheControl As TextBox, _
TheControlsLabel As Label, _
TheCheckBoxToCheck As CheckBox)

'check if the field should be shown or not
If TheCheckBoxToCheck = -1 Then
'show the field and its label
TheControl.Visible = True
TheControlsLabel.Visible = True

'now place the label and the control
TheControl.Left = lCurrentXposition
TheControlsLabel.Left = lCurrentXposition

'now add the width of the control to the current x position and add the space
lCurrentXposition = lCurrentXposition + TheControl.Width + l_Width_Between_Controls
Else
'the field does not need to be shown
'hide the field and its label
TheControl.Visible = False
TheControlsLabel.Visible = False
End If
End Sub

ניתן לראות שאני מעביר לפונקציה הזאת את שם השדה בדוח שאותו אני רוצה להציג/לסתיר ולמקם (TheControl). כמו כן אני מעביר את שם התוית של אותו פקד (TheControlsLabel) וגם את תיבת הסימון שאותו אני צריך לבדוק (TheCheckBoxToCheck).
כמו כן הפונקציה ממקמת את השדה במיקום lCurrentXposition.
לאחר המיקום, הפונקציה מכינה את המשתנה הנ"ל לשדה הבא. את זה היא עושה על ידי הוספת הרוחב של השדה שמיקמנו + רווח שהגדרנו מראש שיהיה בין שדה לשדה (l_Width_Between_Controls).
הפונקציה הזאת תעבוד בצורה מושלמת כל עוד הרוחב של התוית לא תעלה על זו של השדה עצמו, כמובן שגם את זה ניתן לפתור אבל אתה לא רוצה שאני אחשוב פה על הכל נכון?

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

'constant to define the width to be used between control (space)
Const l_Width_Between_Controls As Long = 10

'variable to hold the current position of the placing
Dim lCurrentXposition As Long

Private Sub Report_Open(Cancel As Integer)
'start the placing of the controls from position l_Width_Between_Controls
lCurrentXposition = l_Width_Between_Controls

'hide or show each of the fields and place them according to
'values selected on form1 (the form that chooses which fields to show)
Call PlaceTheControl(Field1, Label1, Forms![Form1]![chkField1])
Call PlaceTheControl(Field2, Label2, Forms![Form1]![chkField2])
Call PlaceTheControl(Field3, Label3, Forms![Form1]![chkField3])
Call PlaceTheControl(Field4, Label4, Forms![Form1]![chkField4])
Call PlaceTheControl(Field5, Label5, Forms![Form1]![chkField5])
Call PlaceTheControl(Field6, Label6, Forms![Form1]![chkField6])
Call PlaceTheControl(Field7, Label7, Forms![Form1]![chkField7])
Call PlaceTheControl(Field8, Label8, Forms![Form1]![chkField8])
Call PlaceTheControl(Field9, Label9, Forms![Form1]![chkField9])
Call PlaceTheControl(Field10, Label10, Forms![Form1]![chkField10])
End Sub

זהו, אני מקוה שהבנת את הכל, כמו שאמרתי קודם, אני אשמח לענות על כל שאלה שתהיה לך.

א.




                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
szargel

   13:09   08.06.03   
אל הפורום  
  4. תודה רבה.  
בתגובה להודעה מספר 3
 
   עבר עריכה לאחרונה בתאריך 08.06.03 בשעה 14:40
 
אבל יש משהו ששכחתי לציין.
לכל עמודה צריך להיות רוחב שונה, בנוסף, אם אני אכניס את כל השדות לדו"ח, הוא יקח יותר מדף אחד (לרוחב).
כיצד ניתן בעצם להתגבר על "בעיה" זו?
(בהנחה כמובן שהמשתמש לא ינסה/לא יוכל להדפיס את כל השדות)

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
faktoraa

   14:48   08.06.03   
אל הפורום  
  5. אין בעיה  
בתגובה להודעה מספר 4
 
   שלום שוב.

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

אם יש לך עוד שאלות, אני כאן.

א.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
szargel

   14:52   08.06.03   
אל הפורום  
  6. עוד 2 שאלות.  
בתגובה להודעה מספר 5
 
   1. האם ניתן להדפיס קווים שיפרידו בין השדות? (בהנחה שכל פעם ממוקם שדה ברוחב שונה במיקום שונה)
2. כיצד ניתן בטופס להגביל את המשתמש כך שלא יוכל לסמן יותר שדות ממה שיכנס בדף (הכוונה כמובן היא להגדיר במקום כלשהוא את הרוחב של כל שדה)?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
faktoraa

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

עכשיו לחלק השני:
לקחתי את אותו הדוח מהדוגמה הקודמת, הוספתי לשדות מסגרת ושיניתי את הקוד שפונה לFORM1 שיפנה לFORM2, מיד נגיע לזה. כמו כן על מנת למנוע רווחים בין המסגרות שהוספנו, הורדתי מהדוגמה הקודמת את ההוספה של רווח בין השדות. זהו מבחינת השינויים שבדוח עצמו.

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

Private Sub Form_Open(Cancel As Integer)
'fill the text boxes with the widths of each of the fields
Dim aReport As Report_Report2
Set aReport = New Report_Report2

txtWidth1 = aReport.Field1.Width
txtWidth2 = aReport.Field2.Width
txtWidth3 = aReport.Field3.Width
txtWidth4 = aReport.Field4.Width
txtWidth5 = aReport.Field5.Width
txtWidth6 = aReport.Field6.Width
txtWidth7 = aReport.Field7.Width
txtWidth8 = aReport.Field8.Width
txtWidth9 = aReport.Field9.Width
txtWidth10 = aReport.Field10.Width

Set aReport = Nothing

'initialize the current report width
lCurrentReportWidth = 0
End Sub

מה שהקוד הזה עושה זה מגדיר משתנה הפונה לדוח החדש (Report2) ומזין לתוך תיבות הטקסט שהוספתי את הרוחב של כל אחד מהשדות בדוח. כמו כן אני מאפס את המשתנה אשר מחזיק את הרוחב הנוכחי של הדוח - lCurrentReportWidth.

עכשיו הוספתי לקוד של הטופס את הפונקציה הזאת:

Private Sub CalculateTotalWidth(aCheckBox As CheckBox, aTextBox As TextBox)
Static blInCalculation As Boolean

'check if we are already in a calculation, if yes then exit, if not then
'set the value of blInCalculation to True
If blInCalculation Then Exit Sub
blInCalculation = True

'check if the check box is now ticked or unticked
If aCheckBox = -1 Then
'check if adding the width of the new check box will cause the total
' to be more than Max_Width_For_Report
If aTextBox + lCurrentReportWidth > Max_Width_For_Report Then
'give a message box that it is too big and cancel the checkbox
MsgBox "The width of the report will be more than allowed!"
aCheckBox = 0
Else
'add the length of the field to the current report width
lCurrentReportWidth = lCurrentReportWidth + aTextBox
End If
Else
'subtract the width of the field
lCurrentReportWidth = lCurrentReportWidth - aTextBox
End If

'show the total report width on the form
txtTotalWidth = lCurrentReportWidth

'change the switch blInCalculation
blInCalculation = False
End Sub

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

Private Sub chkField1_Click()
Call CalculateTotalWidth(chkField1, txtWidth1)
End Sub

זהו, כמובן שהכל יהיה יותר ברור כשתפתח את הדוגמה.

אני עוד כאן.

א.




                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
szargel

   16:33   08.06.03   
אל הפורום  
  10. תודה רבה.  
בתגובה להודעה מספר 9
 
   את בעיית הקו פתרתי באמצעות הוספת פונקציה שקראתי לה לצורך העניין PlaceTheLine, היא זהה לפונקציה שלך, רק שבמקום לקרוא לה עם השדות ככה:

Call PlaceTheControl(Phone, L_Phone, Forms![Print_Form]![C_Phone])

קראתי לה ככה:

Call PlaceTheLine(Line63, Line48, Forms![Print_Form]![C_Phone])

אם יהיו לי עוד שאלות אני אשאל....


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
faktoraa

   14:54   08.06.03   
אל הפורום  
  7. תגובה ל''עריכה''  
בתגובה להודעה מספר 4
 
   עניתי לך לפני שראיתי את העריכה אז לגבי השאלה השניה:

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


lCurrentXposition = l_Width_Between_Controls

אם נניח שיש שדה אחד שהרוחב שלו הוא 80 אז במקום השורה הנ"ל צריך להיות:


lCurrentXposition = l_Width_Between_Controls + 80 + l_Width_Between_Controls

מה שאומר רווח + 80 + רווח.

א.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
szargel

   14:58   08.06.03   
אל הפורום  
  8. תודה רבה.  
בתגובה להודעה מספר 7
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
hll

   20:20   08.06.03   
אל הפורום  
  11. שיאללה!! איזה סוס טרויאני!! faktoraa  
בתגובה להודעה מספר 0
 
   פפששש
סחטיקה על התגובות המקצועיות...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net