اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر (معدل)

سؤال عن اضاقة قيم من نموذج غير منضم الى حقول فى جدول من خلال   Recordset.AddNew

الطريقة التقليدية اعلمها ولكن احاول عمل  Function  يسهل العملية 

وتدور فكرتى باستدعاء الكود كالاتى 

Call ApendData("Table Name", "Field Name On Table", Object Name On Form)

وهذه الاكواد التى استخدمتها فى الموديول 

Sub ApendData(ByVal strTableName As String, ByVal strFieldName As String, ByVal strObjectName As String)
      
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  
  Set db = CurrentDb()
  Set rs = CurrentDb().OpenRecordset(strTableName)

    rs.AddNew
      rs.Fields(strFieldName) = "" & strObjectName & ""
    rs.Update
    rs.Close

End Sub

ولكن المشكلة انه تم اضافة البيانات فى اكصر من سجل حسبب عدد الحقول وبيانات كل حقل قى سجل

المفروض ان يتم تسجيل كافة بيانات الحقول فى سدل واحد كيف يمكن عمل ذلك

المرفق

 

ApendDataByRecordset.mdb

تم تعديل بواسطه ابا جودى
  • أفضل إجابة
قام بنشر

وعليكم السلام 🙂

 

تفضل:

Private Sub Command4_Click()
  
  Call ApendData("MyTable", Me)
End Sub

Function ApendData(strTableName As String, frm As Form)
      
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim ctl As Control
  
  Set db = CurrentDb()
  Set rs = db.OpenRecordset(strTableName)

    rs.AddNew
        
        For Each ctl In frm.Controls
            If ctl.ControlType <> acLabel And ctl.ControlType <> acCommandButton Then
                rs.Fields(ctl.Name) = ctl.Value
            End If
        Next ctl
        
    rs.Update
    
    rs.Close

End Function

 

جعفر

ApendDataByRecordset.zip

  • Like 5
قام بنشر

هلا والله وميت مليون هلا استاذى الجليل ومعلمى القدير و والدى الحبيب استاذ @jjafferr :fff:

والله فعلا انا عن نفسي احس بالانس وبالامان بوجودكم فى المنتدى لانه بفضل الله تعالى ثم انتم لكل مشكلة حل

أدامكم الله روح طيبة تسكن القلوب .. ووجه باسم ترتاح له العيون .. ونفس مطمئنة تمتلك النفوس ..
وأسأله عز وجل أن يعطيكم من عطــاياه ويمنحكم عفوه ورضاه ويغفر لكم من عمركم ما مضى ويقدر لكم الخير فيما أتى ..
وأن يجعل السعادة رفيقتكم في الدنيا والآخره.. اللهم آمين.

1929699740_-().jpg.82c68b4ca680598ce45bfe983433fce5.jpg

  • Like 1
قام بنشر (معدل)

عندى استفسار من فضلك استاذى الجليل ومعلمى القدير و والدى الحبيب استاذ @jjafferr :fff:

بخصوص الية ملئ عدة حقول كثرت او قلت فى جدول ما من خلال روتين عام تلك الفكرة هى ما درات بخلدى 

ما رأيكم بها استاذى ؟!

هل هى مرنة ؟ هل قد نواجه بسببها مشاكل مستقبلا ؟!
هل هناك طريقة او فكرة افضل من تلك 

تم تعديل بواسطه ابا جودى
قام بنشر
19 دقائق مضت, ابا جودى said:

هل قد نواجه بسببها مشاكل مستقبلا

استاذي العزيز ابا جودي.. احيانا المستخدم يخطأ ويدخل نص في الحقل الرقمي

ارجو الانتباه لتلك النقطة رغم بساطتها... بالحقيقة الطريقة جميلة وتغنيك عن الكثير من الاكواد ان كان لديك العديد من النماذج

 

  • Thanks 1
قام بنشر
3 دقائق مضت, Eng.Qassim said:

يخطأ ويدخل نص في الحقل الرقمي

لا يمكن ذلك لان الكود يدرج القيم تبعا لنوع الحقل حتما سوف يحدث خطأ فى تلك الحالة ولن يستكمل ادارج البيانات ..لم اجرب ولكن ذلك ما سوف يحدث

وبالفعل تلك نتيجة التجربة لم يتم الاستمرار بملئ بيانات الحقول وتم اجهاض العملية نتيجة خطأ 
وهو اضافة نوع بيانات مختلف عن النوع المخصص للحقل فى الجدول 

111.png.cfeb78d3e686885ebb48703ea32097b4.png

  • Like 1
قام بنشر
53 دقائق مضت, ابا جودى said:

ما رأيكم

انا عن نفسي ، لم استخدم هذه الطريقة ابداً في اي من برامجي ، وإنما استخدم طريقة اكسس التقليدية 🙂

طبعا هذا لا يعني ان لا يكون هناك حالات خاصة في المستقبل قد استعملها فيها 🙂

بكلام آخر ، انا دائما استخدم طرق اكسس التقليدية :

1. استخدم ربط الجداول بالطريقة العادية ،

2. لا اعمل اخفاء للجداول والاستعلامات والنماذج و..

3. استخدم قوائم زر الفأرة اليمين ،

4. واستخدم العمود الفقري وقوة الاكسس ، الاستعلامات العادية ، والجأ الى الكود وقت الحاجة ،

5. وووو

 

جعفر

  • Like 3
قام بنشر (معدل)
3 ساعات مضت, jjafferr said:

طبعا هذا لا يعني ان لا يكون هناك حالات خاصة في المستقبل قد استعملها فيها 🙂

تلك الكلمات تجهلنى استخدم هذه الطريقة ان شاء الله وانا مطمئن :yes:

تم تعديل بواسطه ابا جودى
قام بنشر

استاذى الجليل ومعملى القدير و والدى الحبيب استاذ @jjafferr :fff:

اعتذر لاثقالى على كاهلكم

هل من طريقة لتحويل المود الاتى وهو لكم استاذى الى  Function  ليتم استدعائه بسخولة حسب الحالة مثلما حاولت جاهدا عمل ذلك من خلال ال Recordset

تسهيلا من كتابة اسطر الاكواد وزيادتها بزيادة الحقول ؟!

mySQL = "INSERT INTO UsystbllvlUsers"
mySQL = mySQL & "( IDUser,"    
mySQL = mySQL & "IDGroup,"   
mySQL = mySQL & "UName,"        
mySQL = mySQL & "UPassword,"    
mySQL = mySQL & "FullName,"       
mySQL = mySQL & "lvlQ1 ,"       
mySQL = mySQL & "lvlAnsr1,"      
mySQL = mySQL & "lvlQ2 ,"      
mySQL = mySQL & "lvlAnsr2,"     
mySQL = mySQL & "lvlQ3 ,"        
mySQL = mySQL & "lvlAnsr3,"      
mySQL = mySQL & "Umail )"      

mySQL = mySQL & " SELECT "
mySQL = mySQL & " 1 AS IDUser,"                              
mySQL = mySQL & " 3 AS IDGroup,"                          
mySQL = mySQL & " Encoder(""admin"") AS UName,"            
mySQL = mySQL & " Encoder(""admin"") AS UPassword,"        
mySQL = mySQL & " Encoder(""admin"") AS FullName,"            
mySQL = mySQL & " 20 AS lvlQ1,"             '6 Questions
mySQL = mySQL & " Encoder(""administrator"") AS lvlAnsr1,"      
mySQL = mySQL & " 20 AS lvlQ2,"             '6 Questions
mySQL = mySQL & " Encoder(""admin"") AS lvlAnsr2,"       
mySQL = mySQL & " 20 AS lvlQ3,"             '6 Questions
mySQL = mySQL & " Encoder(""managaer"") AS lvlAnsr3,"          
mySQL = mySQL & " Encoder(""admin@admin.com"") AS Umail;"  

'Debug.Print mySQL

DoCmd.SetWarnings False
DoCmd.RunSQL mySQL
DoCmd.SetWarnings True

 

قام بنشر

وعليكم السلام 🙂

 

استخدمت نتائج Debug.print في الكود تبعك ، ثم حولته الى استعلام (اتضح انه استعلام الحاقي) ، حتى ابدأ من هنا 🙂

 

طريقتي:

اعمل الاستعلام بالطريقة المعتادة:

image.png.66a9f6b1b1298f4961a8a9ff47d83000.png

.

هذه المسمات لا قيمة ولا فائدة منها ، ويمكننا ان نحذفها ، لأن الاكسس بيعطينا اسم جديد لأي حقل مافيه اسم :

image.png.b0cc8b9c7509ddffa33f58f55843cc05.png

.

جميع الحقول في الاستعلام تحتاج الى قيمة ، فيجب ان تكون جميع هذه القيم متغيرات ، وعددها 12 حقل ، بالاضافة الى اسم الجدول ،

ولتبسيط هذه العملية ، سأستخدم اسم الحقل المراد الاضافة اليه بالاضافة الى الرقم 9 ، مثل: IDUser9 ، IDGroup9 ،

 

بتحويل الاستعلام الاصل الى SQL ، نحصل على هذه الجملة:

INSERT INTO UsystbllvlUsers( IDUser,IDGroup,UName,UPassword,FullName,lvlQ1 ,lvlAnsr1,lvlQ2 ,lvlAnsr2,lvlQ3 ,lvlAnsr3,Umail ) SELECT  1 AS IDUser, 3 AS IDGroup, Encoder("admin") AS UName, Encoder("admin") AS UPassword, Encoder("admin") AS FullName, 20 AS lvlQ1, Encoder("administrator") AS lvlAnsr1, 20 AS lvlQ2, Encoder("admin") AS lvlAnsr2, 20 AS lvlQ3, Encoder("managaer") AS lvlAnsr3, Encoder("admin@admin.com") AS Umail;

 

ومن هنا سأبدأ عملية التغيير الى كود ، والهدف بعد الدقة ، هو سهولة الوصول الى الحقول المتشابهة ، اي الحقل والحقل الذي ستاتي منه البيانات ،

 

1. تفكيك جزئي الجملة ، الجزء الى والجزء من ، وتحويل جميع علامات " الى ' في الجملة (ما عدا التي يجب ان تبقى) :

    mySQL = "INSERT INTO UsystbllvlUsers( IDUser,IDGroup,UName,UPassword,FullName,lvlQ1 ,lvlAnsr1,lvlQ2 ,lvlAnsr2,lvlQ3 ,lvlAnsr3,Umail )"
    mySQL = mySQL & " SELECT  1 AS IDUser, 3 AS IDGroup, Encoder('admin') AS UName, Encoder('admin') AS UPassword, Encoder('admin') AS FullName, 20 AS lvlQ1, Encoder('administrator') AS lvlAnsr1, 20 AS lvlQ2, Encoder('admin') AS lvlAnsr2, 20 AS lvlQ3, Encoder('managaer') AS lvlAnsr3, Encoder('admin@admin.com') AS Umail"

 

2. تفكيك كل جزء الى اسم الجدول ، ثم السطر الثاني يكون اسماء الحقول ، ولنسمي هذه الاسطر 1، 2، 3، 4

    mySQL = "INSERT INTO " & UsystbllvlUsers
    mySQL = mySQL & " ( IDUser,IDGroup,UName,UPassword,FullName,lvlQ1 ,lvlAnsr1,lvlQ2 ,lvlAnsr2,lvlQ3 ,lvlAnsr3,Umail )"
    
    mySQL = mySQL & " SELECT "
    mySQL = mySQL & " 1 AS IDUser, 3 AS IDGroup, Encoder('admin') AS UName, Encoder('admin') AS UPassword, Encoder('admin') AS FullName, 20 AS lvlQ1, Encoder('administrator') AS lvlAnsr1, 20 AS lvlQ2, Encoder('admin') AS lvlAnsr2, 20 AS lvlQ3, Encoder('managaer') AS lvlAnsr3, Encoder('admin@admin.com') AS Umail"

 

ثم ندرج السطر الثاني والرابع تحت بعض (مؤقتا) ، حتى لا نخطأ ، ويكون الحقل من والى تحت بعض (لاحظ الفاصلة بين الحقول) :

image.png.3f61dae2bc1c1afbda0f8d6893d28015.png

وعليه ، يصبح السطرين

    mySQL = mySQL & " (  IDUser,  IDGroup,                     UName,                     UPassword,                     FullName,  lvlQ1,             lvlAnsr1,  lvlQ2 ,           lvlAnsr2, lvlQ3 ,             lvlAnsr3,Umail )"
    mySQL = mySQL & "   IDUser9, IDGroup9, Encoder('" & UName9 & "'), Encoder('" & UPassword9 & "'), Encoder('" & FullName9 & "'), lvlQ19, Encoder('lvlAnsr19'), lvlQ29, Encoder('lvlAnsr9'), lvlQ39, Encoder('lvlAnsr39'), Encoder('Umail9')"

 

ثم نقوم بتغيير السطر حتى يأخذ المتغيرات (بدلا من مجرد وجودها في السطر الثاني) ، وهنا العمل الفعلي :

image.png.075be672d7cea8b0714aaa27b3825fbe.png

 

الآن تم تعديل الكود لكي يستعمل المتغيرات  ، ويمكنك استعماله بهذه الطريقة :

    mySQL = "INSERT INTO " & UsystbllvlUsers
    mySQL = mySQL & " ( IDUser, IDGroup, UName, UPassword, FullName, lvlQ1, lvlAnsr1, lvlQ2, lvlAnsr2, lvlQ3, lvlAnsr3,Umail )"
    mySQL = mySQL & " SELECT "
    mySQL = mySQL & IDUser9 & ", " & IDGroup9 & ", Encoder('" & UName9 & "'), Encoder('" & UPassword9 & "'), Encoder('" & FullName9 & "')," & lvlQ19 & ", Encoder('" & lvlAnsr19 & "'), " & lvlQ29 & ", Encoder('" & lvlAnsr9 & "'), " & lvlQ39 & ", Encoder('" & lvlAnsr39 & "'), Encoder('" & Umail9 & "')"

 

فيصبح الكود النهائي بالشكل الذي انت تريده ، ولاحظ اهمية كتابة رقم الحقل بحيث الجزء الآخر يأخذ نفس الرقم ، فيسهل عليك معرفة كل جزء من الكود :

Function Run_SQL(UsystbllvlUsers9, IDUser9, IDGroup9, UName9, UPassword9, FullName9, lvlQ19, lvlAnsr19, lvlQ29, lvlAnsr29, lvlQ39, lvlAnsr39, Umail9)


    Dim mySQL As String
    
    mySQL = "INSERT INTO " & UsystbllvlUsers9
    mySQL = mySQL & "( IDUser,"     '1
    mySQL = mySQL & "IDGroup,"      '2
    mySQL = mySQL & "UName,"        '3
    mySQL = mySQL & "UPassword,"    '4
    mySQL = mySQL & "FullName,"     '5
    mySQL = mySQL & "lvlQ1 ,"       '6
    mySQL = mySQL & "lvlAnsr1,"     '7
    mySQL = mySQL & "lvlQ2 ,"       '8
    mySQL = mySQL & "lvlAnsr2,"     '9
    mySQL = mySQL & "lvlQ3 ,"       '10
    mySQL = mySQL & "lvlAnsr3,"     '11
    mySQL = mySQL & "Umail )"       '12

    mySQL = mySQL & " SELECT "
    mySQL = mySQL & IDUser9 & ", "     '1
    mySQL = mySQL & IDGroup9 & ", "    '2
    mySQL = mySQL & " Encoder('" & UName9 & "'), "            '3
    mySQL = mySQL & " Encoder('" & UPassword9 & "'), "        '4
    mySQL = mySQL & " Encoder('" & FullName9 & "'), "         '5
    mySQL = mySQL & lvlQ19 & ", "             '6 Questions    '6
    mySQL = mySQL & " Encoder('" & lvlAnsr19 & "'), "         '7
    mySQL = mySQL & lvlQ29 & ", "              '6 Questions   '8
    mySQL = mySQL & " Encoder('" & lvlAnsr29 & "'), "         '9
    mySQL = mySQL & lvlQ39 & ", "             '6 Questions    '10
    mySQL = mySQL & " Encoder('" & lvlAnsr39 & "'), "         '11
    mySQL = mySQL & " Encoder('" & Umail9 & "') "             '12
 
    'Debug.Print mySQL

    DoCmd.SetWarnings False
        DoCmd.RunSQL mySQL
    DoCmd.SetWarnings True
    
End Function

.

وتناديه بإرسال قيم هذه المتغيرات :

Call Run_SQL(tbl_Name,IDUser, IDGroup, UName, UPassword, FullName, lvlQ1, lvlAnsr1, lvlQ2, lvlAnsr2, lvlQ3, lvlAnsr3, Umail)

 

 

جعفر

  • Like 3
قام بنشر

استاذى الجليل ومعلمى القدير و والدى الحبيب استاذ @jjafferr :fff:
انا اسف جدا جدا جدا جدا جدا وعلى استحياء منكم اقدم خالص اعتذارى لتعبكم ومجهودكم

ولكن استاذى لو احببت تحويل الكود الى روتين عام بنفس هيئته لفعلتها ولكن لم اقصد ذلك

انا اقصد الحاق بيانات من الى الجدول من هلال كود مرن بنفس الالية فقط مثل هذا السطر 

rs.Fields(ctl.Name) = ctl.Value

مهما كان اسم الحقل ومهما كان اسم العنصر فى النموذج يتم اضافة البيانات 

ولكن انا احببت ان يكون الكود من خلال استعلام ديناميكى على طريقتم واتيت بالكود لاننى اريد ان يتم الالحاف على نفس المنهج فقط ولكن لم اقصد تحويل الكود بعينه وبمسمياته

قام بنشر

وعليكم السلام 🙂

 

الطريقة التي تريدها لا تصلح !!

عندك الكثير من الحالات ، مثل: نوع الحقل ، واستخدام دوال خاصة ، وووو

 

اليك ما توصلت له ، وبتعرف قصدي من الملاحظات اعلاه:

Function Do_SQL(strTableName As String, frm As Form) As String

    Dim ctl As Control
    Dim mySQL As String, mySQL_f As String, mySQL_v As String
    
    'mySQL_f = Fields
    'mySQL_v = Values
    '
    'filed names to reveal field Types, examples:
    'str_Name > Text
    'dt_Today > Date
    '
    
        For Each ctl In frm.Controls
            If ctl.ControlType <> acLabel And ctl.ControlType <> acCommandButton Then
            
                'fields
                mySQL_f = mySQL_f & ", " & ctl.Name
                

                'values
                Select Case ctl.Name    'special cases
                    Case "Uname", "UPassword", "FullName", "lvlAnsr1", "lvlAnsr", "lvlAnsr3", "Umail"
                        mySQL_v = mySQL_v & ", Encoder('" & ctl.Value & "')"
                       
                    Case Else
                        
                        If Left(ctl.Name, 3) = "str" Then       'text
                            mySQL_v = mySQL_v & ", '" & ctl.Value & "'"
                    
                        ElseIf Left(ctl.Name, 2) = "dt" Then    'Date
                            mySQL_v = mySQL_v & ", #" & ctl.Value & "#"
                            
                        Else    'the normal
                            mySQL_v = mySQL_v & ", " & ctl.Value
                        
                        End If
                End Select
                                
                                
            End If  'ctl.ControlType
        Next ctl
        
    'remove the initial comma
    mySQL_f = Mid(mySQL_f, 2)
    mySQL_v = Mid(mySQL_v, 2)
    
    mySQL = "INSERT INTO " & strTableName
    mySQL = mySQL & " ( " & mySQL_f & " ) "
    mySQL = mySQL & " SELECT "
    mySQL = mySQL & mySQL_v
    Debug.Print mySQL

End Function

.

لهذا السبب ، مشاركتي السابقة هي افضل طريقة للتعامل مع هذا النوع من الاستعلامات 🙂

 

جعفر

  • Like 2

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • اضف...

Important Information