منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : مشكلة في اختيار أسماء العناصر العربية في ComboBox في MS Access
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
مرحباً جميعاً،
لدي قاعدة بيانات تم إنشاؤها في MS Access ومتصلة بجداول في SQL Server. هناك قائمة منسدلة (ComboBox) أستخدمها لاختيار العناصر. تعمل القائمة بشكل جيد عند اختيار أسماء العناصر باللغة الإنجليزية، ولكن عند محاولة اختيار العناصر التي تكون أسماؤها باللغة العربية، تظهر لي الخطأ التالي:
[يرجى إدراج رسالة الخطأ هنا]
بعض الملاحظات الإضافية:
  • نوع الحقل في جدول SQL هو
    nvarchar
  • ، وعند فتح الجدول في SQL Server تظهر أسماء العناصر العربية بشكل صحيح.
  • المثير للاهتمام أنه إذا قمت باختيار العنصر باستخدام الباركود بدلاً من الاسم (حتى لو كان الاسم باللغة العربية)، فإنه يعمل دون مشاكل.
المشكلة تحدث فقط عند اختيار أسماء العناصر العربية مباشرةً من القائمة المنسدلة.

كود :
Private Sub CboName_AfterUpdate()
On Error GoTo ErrorHandler
If Me.Customer <> "" Then
Me.frm_froshtn_detail.SetFocus
DoCmd.GoToRecord , , acNewRec
Beep
Form_frm_froshtn_detail.ProName = DLookup("[ProName]", "tbl_Product", "[ProName]='" & Me.CboName & "'")
Form_frm_froshtn_detail.ProCode = DLookup("[ProCode]", "tbl_Product", "[ProName]='" & Me.CboName & "'")
Form_frm_froshtn_detail.Cost = DLookup("[Cost]", "tbl_Product", "[ProName]='" & Me.CboName & "'")
Form_frm_froshtn_detail.Price = DLookup("[Price]", "tbl_Product", "[ProName]='" & Me.CboName & "'")
Me.Refresh
Form_frm_froshtn_detail.Refresh
Me.CboName = Null
Me.CboBarCode.SetFocus
Else

Me.CboName = Null
Me.CboBarCode.SetFocus
Beep
msgbox "Nawy kryar la sarawa halbzhera"

End If
   Exit Sub:
ErrorHandler:
msgbox "Okey Bka:" & err.Description, vbExclamation, "Error" & err.Number
End Sub


هل واجه أحدكم مشكلة مشابهة أو يعرف طريقة لحل هذه المشكلة؟


شكراً جزيلاً على المساعدة!
شكرا جزيلا على الرد

الان عندى مشكە اخرى
شكرا جزيلا على الرد 
السطر البرمجى لل cmobox كالاتى و الاغريب في الموضوع هو عندما اختار مادة كتوبت باللغة الانجليزية ما في مشكلة بس اذا كان المادة المختار مكتوب بالاحرف العربية يطلع المشكلة
كود :
Private Sub Combo63_AfterUpdate()
 
On Error GoTo ErrorHandler


    If Nz(Me.Company, "") <> "" Then
        Me.frm_InOrderDetail.SetFocus
        DoCmd.GoToRecord , , acNewRec
        Beep

        Dim selectedProName As String
        selectedProName = Trim(Me.Combo63)

        ' Safely use DLookup with double quotes for Arabic compatibility
        Form_frm_InOrderDetail.ProName = Nz(DLookup("[ProName]", "tbl_Product", "[ProName]=" & Chr(34) & selectedProName & Chr(34)), "")
        Form_frm_InOrderDetail.ProCode = Nz(DLookup("[ProCode]", "tbl_Product", "[ProName]=" & Chr(34) & selectedProName & Chr(34)), "")
        Form_frm_InOrderDetail.Cost = Nz(DLookup("[Cost]", "tbl_Product", "[ProName]=" & Chr(34) & selectedProName & Chr(34)), 0)
        Form_frm_InOrderDetail.DateExp = Nz(DLookup("[Exp]", "tbl_Product", "[ProName]=" & Chr(34) & selectedProName & Chr(34)), Null)

        Me.Refresh
        Me.Combo63 = Null
        Me.CboBarCode.SetFocus
    Else
        Beep
        msgbox "Nawy Companya la sarawa halbzhera", vbExclamation, "Error"
    End If

    Exit Sub

ErrorHandler:
    msgbox "Okey Bka: " & err.Description, vbExclamation, "Error " & err.Number
End Sub
شكرا جزيلاى على الرد و لكن نفس المشكلە باقى 
هل تعتقد ان هناك مشكلە في جدوالى SQL ؟
المشكلة التي تواجهها عند اختيار أسماء المنتجات باللغة العربية في ComboBox ترجع على الأرجح إلى ترميز النصوص (Encoding) أو التعامل مع الأحرف العربية في الاستعلامات النصية داخل DLookup.

أسباب محتملة للمشكلة:
اختلاف الترميز (Collation) بين Access و SQL Server

قد يكون هناك عدم تطابق في الترميز بين الحقل nvarchar في SQL Server وبيئة Access.
استخدام علامات الاقتباس المفردة ' مع النص العربي

عند تمرير اسم المنتج العربي في DLookup, قد لا تتم معالجته بشكل صحيح بسبب المسافات أو المحارف الخاصة.
وجود مسافات غير مرئية في البيانات العربية

بعض الحقول في SQL Server قد تحتوي على مسافات زائدة أو رموز غير مرئية في نهاية أو بداية النص.
عدم تطابق نوع البيانات عند البحث في DLookup

DLookup يستخدم مقارنة نصية مباشرة، مما قد يسبب أخطاء مع النصوص العربية.
الحل المقترح:
 1. استخدام Trim لإزالة المسافات غير المرئية
قبل تمرير اسم المنتج إلى DLookup، قم بإزالة أي مسافات زائدة:

PHP كود :
Dim proName As String
proName 
Trim(Me.CboName)

Form_frm_froshtn_detail.ProName DLookup("[ProName]""tbl_Product""[ProName]= '" proName "'")
Form_frm_froshtn_detail.ProCode DLookup("[ProCode]""tbl_Product""[ProName]= '" proName "'")
Form_frm_froshtn_detail.Cost DLookup("[Cost]""tbl_Product""[ProName]= '" proName "'")
Form_frm_froshtn_detail.Price DLookup("[Price]""tbl_Product""[ProName]= '" proName "'"

 2. إضافة N قبل النص العربي عند استخدام nvarchar

عند التعامل مع الحقول من نوع nvarchar في SQL Server، يجب وضع N قبل النص العربي حتى يتم تفسيره بشكل صحيح:

PHP كود :
Form_frm_froshtn_detail.ProName DLookup("[ProName]""tbl_Product""[ProName]= N'" proName "'")
Form_frm_froshtn_detail.ProCode DLookup("[ProCode]""tbl_Product""[ProName]= N'" proName "'")
Form_frm_froshtn_detail.Cost DLookup("[Cost]""tbl_Product""[ProName]= N'" proName "'")
Form_frm_froshtn_detail.Price DLookup("[Price]""tbl_Product""[ProName]= N'" proName "'"

 3. التأكد من تطابق Collation بين Access و SQL Server

افتح SQL Server Management Studio (SSMS) ونفذ الأمر التالي للتحقق من الترميز (Collation) الخاص بجدول tbl_Product:

PHP كود :
SELECT namecollation_name 
FROM sys
.columns 
WHERE object_id 
OBJECT_ID('dbo.tbl_Product') AND name 'ProName' 

إذا كان الترميز مختلفًا (Latin1_General_CI_AS مثلاً)، فجرّب تغييره إلى Arabic_CI_AS:

PHP كود :
ALTER TABLE tbl_Product
ALTER COLUMN ProName NVARCHAR
(255COLLATE Arabic_CI_AS 

 4. البحث باستخدام الباركود بدلاً من الاسم

بما أن البحث بالباركود يعمل بشكل صحيح، يمكنك تعديل DLookup ليتم البحث باستخدام ProCode بدلاً من ProName:

PHP كود :
Dim proCode As String
proCode 
DLookup("[ProCode]""tbl_Product""[ProName]= N'" proName "'")

Form_frm_froshtn_detail.ProName proName
Form_frm_froshtn_detail
.ProCode proCode
Form_frm_froshtn_detail
.Cost DLookup("[Cost]""tbl_Product""[ProCode]= '" proCode "'")
Form_frm_froshtn_detail.Price DLookup("[Price]""tbl_Product""[ProCode]= '" proCode "'"

? الخلاصة
1. استخدم Trim() للتخلص من المسافات غير المرئية.
2. استخدم N عند تمرير القيم إلى DLookup للتعامل مع nvarchar.
3. تأكد من أن Collation في SQL Server يدعم اللغة العربية.
4. إذا استمر الخطأ، استخدم الباركود كمرجع بدلاً من الاسم.