- المشاركات
- 92
- مستوى التفاعل
- 2
- النقاط
- 6
لدي تطبيق دلفي و قاعدة البيانات اوراكل عندما اريد اضافة عنصر ياتيني هذا الخطأ
قال ChatGPT:
الخطأ الذي يظهر لك هو ORA-00001: unique constraint violated، مما يعني أنك تحاول إدخال قيمة في جدول قاعدة بيانات أوراكل، ولكن هناك قيود UNIQUE أو PRIMARY KEY تمنع هذا الإدخال بسبب التكرار.
كيف تحل المشكلة ؟
تحقق من القيم المكررة
تأكد من أن القيمة التي تحاول إدخالها غير مكررة في الجدول، خاصة القيم التي تحتوي على مفتاح فريد (Unique Key) أو المفتاح الأساسي (Primary Key) مثل رقم الضمان الاجتماعي (Sécurité Sociale) أو ID Employé.
البحث عن القيد المسبب للمشكلة
نفذ الاستعلام التالي في SQL Developer أو أي أداة إدارة أوراكل لمعرفة تفاصيل القيد الفريد:
sql
نسخ
تحرير
SELECT constraint_name, table_name, column_name
FROM user_cons_columns
WHERE constraint_name = 'SYS_C007056';
هذا سيظهر لك اسم الجدول والأعمدة التي لديها هذا القيد.
التحقق من البيانات الموجودة في الجدول
استخدم الاستعلام التالي لمعرفة إن كانت القيمة التي تحاول إدخالها موجودة بالفعل:
sql
نسخ
تحرير
SELECT * FROM NOM_TABLE WHERE colonne_unique = 'valeur_que_tu_ajoutes';
استبدل NOM_TABLE باسم الجدول و colonne_unique باسم العمود الذي لديه القيد الفريد.
إزالة القيد (إذا كنت متأكدًا أن التكرار مطلوب)
إذا كنت تريد السماح بالقيم المكررة (وهو غير مستحسن في حالة المفاتيح الفريدة)، يمكنك إزالة القيد باستخدام:
sql
نسخ
تحرير
ALTER TABLE NOM_TABLE DROP CONSTRAINT SYS_C007056;
⚠ تحذير: إزالة القيد قد تؤدي إلى مشاكل في سلامة البيانات.
تصحيح الكود في دلفي
عند إضافة سجل جديد، تأكد أنك لا تضيف ID Employé يدويًا، بل اجعله Auto-Increment إذا كان ذلك ممكناً.
تحقق من أن البيانات التي تدخلها في النموذج غير مكررة.
قم بإضافة Try...Except في كود دلفي لالتقاط الخطأ وإعلام المستخدم بطريقة أكثر وضوحًا.
إذا استمرت المشكلة، شاركني بالكود الذي تستخدمه لإضافة البيانات في دلفي وسنبحث عن حل برمجي مناسب.
أنت قلت:
قال ChatGPT:
الخطأ ORA-01741: illegal zero-length identifier يشير إلى أنك تحاول إدخال قيمة فارغة ('') في أحد الأعمدة التي لا يمكن أن تكون فارغة (مثل الأعمدة التي تحتوي على contraintes NOT NULL).
كيف تحل المشكلة؟
1. التحقق من القيم الفارغة في الكود Delphi
من الصورة الثانية، الكود يحتوي على جملة SQL مثل:
delphi
نسخ
تحرير
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES ("' + DBEdit1.Text + '", "' + DBEdit5.Text + '", "' + TodayDate + '")';
هذه الجملة تحتوي على DBEdit1.Text و DBEdit5.Text التي قد تكون فارغة، مما يؤدي إلى هذا الخطأ.
2. تعديل الكود لمنع القيم الفارغة
أضف تحقق قبل تنفيذ INSERT، مثلاً:
delphi
نسخ
تحرير
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
3. استخدام QuotedStr بدلاً من "
في الجملة INSERT INTO, استخدم QuotedStr(DBEdit1.Text) بدلاً من '"' + DBEdit1.Text + '"' لأن QuotedStr يتعامل بشكل صحيح مع القيم الفارغة ويمنع الأخطاء في SQL.
4. التحقق من بنية الجدول في Oracle
نفذ الاستعلام التالي في Oracle SQL Developer:
sql
نسخ
تحرير
DESC Présence;
وتأكد من أن Id_Période و Identifiant_Employé لا تحتوي على قيد NOT NULL إذا كنت تريد إدخال قيم فارغة.
5. تأكيد البيانات في الجدول
قبل محاولة إدخال البيانات، تأكد من أن القيم غير فارغة:
sql
نسخ
تحرير
SELECT * FROM Présence WHERE Id_Période IS NULL OR Identifiant_Employé IS NULL;
إذا وجدت صفوفًا فارغة، فهذا يعني أن هناك خطأ سابق في إدخال البيانات.
الخلاصة
تأكد من عدم ترك الحقول فارغة قبل التنفيذ.
استخدم QuotedStr بدلاً من " عند إدخال القيم النصية.
تحقق من القيم الفارغة في الجدول عبر SELECT.
أضف شرط NOT NULL إذا كنت لا تريد السماح بإدخال بيانات فارغة.
جرب الحل وأخبرني إن كنت بحاجة إلى مزيد من المساعدة!
أنت قلت:
ما المعنى بـ TodayDate
قال ChatGPT:
في الكود الذي كتبته، TodayDate هو متغير من النوع string يُستخدم لتخزين تاريخ اليوم وإدخاله في قاعدة البيانات.
كيفية استخدامه بشكل صحيح
حاليًا، في الكود الخاص بك، لم يتم تعيين قيمة TodayDate قبل استخدامه، مما قد يؤدي إلى خطأ عند تنفيذ الاستعلام.
✔ الحل: تعيين TodayDate إلى تاريخ اليوم
قبل استخدام TodayDate في جملة SQL INSERT، يجب أن تحدد قيمته، على سبيل المثال:
delphi
نسخ
تحرير
var
TodayDate: string;
begin
TodayDate := FormatDateTime('yyyy-mm-dd', Date); // تحديد تاريخ اليوم بصيغة متوافقة مع Oracle
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
لماذا نستخدم FormatDateTime('yyyy-mm-dd', Date) ؟
لأن Oracle يستخدم DATE بتنسيق YYYY-MM-DD.
هذا التنسيق يضمن أن البيانات تُخزن بشكل صحيح دون أخطاء في التوافق.
خلاصة الحل
تعريف TodayDate كمتغير قبل الاستخدام.
إعطاؤه قيمة باستخدام FormatDateTime('yyyy-mm-dd', Date).
التأكد من استخدام QuotedStr عند تمريره في SQL لمنع الأخطاء.
جرب هذا الحل، وإذا استمرت المشكلة، شاركني برسالة الخطأ وسنحلها معًا!
أنت قلت:
قال ChatGPT:
الخطأ ORA-00984: column not allowed here في Oracle يشير إلى أنك تحاول استخدام اسم عمود في مكان غير مناسب في جملة SQL INSERT.
سبب الخطأ المحتمل:
في Delphi، الكود يحتوي على جملة INSERT INTO غير صحيحة، حيث ربما:
يتم تمرير اسم عمود داخل VALUES بدلاً من تمرير قيمة.
يتم الخلط بين القيم النصية والأعمدة بدون استخدام QuotedStr.
يتم إدخال قيمة غير صالحة كحقل في قاعدة البيانات.
الحل: تصحيح جملة INSERT INTO
في كود Delphi، استبدل الجملة التالية:
delphi
نسخ
تحرير
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES ("' + DBEdit1.Text + '", "' + DBEdit5.Text + '", "' + TodayDate + '")';
بـالصيغة الصحيحة:
delphi
نسخ
تحرير
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
تحسين إضافي للتحقق من القيم الفارغة قبل الإدخال
delphi
نسخ
تحرير
var
TodayDate: string;
begin
TodayDate := FormatDateTime('yyyy-mm-dd', Date); // ضبط تاريخ اليوم
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
ملخص الحل
✔ استخدام QuotedStr لحماية القيم النصية عند تمريرها في SQL.
✔ عدم استخدام علامات الاقتباس المزدوجة " داخل SQL مباشرة، استخدم QuotedStr().
✔ التحقق من القيم الفارغة قبل الإدخال لتجنب الأخطاء الأخرى.
✔ ضبط تنسيق التاريخ بحيث يكون متوافقًا مع Oracle.
جرب التعديلات وأخبرني إذا استمر الخطأ!
أنت قلت:
قال ChatGPT:
الخطأ ORA-01861: literal does not match format string يعني أن هناك مشكلة في تنسيق التاريخ الذي يتم إدخاله في قاعدة بيانات Oracle. أي أن القيمة النصية التي تمررها كـ date لا تتطابق مع التنسيق المتوقع من Oracle.
سبب المشكلة
في Oracle، عند إدخال تاريخ نصيًا في INSERT INTO، يجب أن يتطابق مع التنسيق الذي يتوقعه النظام.
على سبيل المثال، إذا كان العمود Date_pre من النوع DATE، وأنت تمرر له نصًا بتنسيق غير متوقع، فسيحدث هذا الخطأ.
الحل: التأكد من تنسيق التاريخ الصحيح
عليك التأكد من أن TodayDate يتبع تنسيق YYYY-MM-DD قبل إدراجه في قاعدة البيانات.
1. تصحيح الكود في Delphi
قم بتعديل الكود بحيث يتم تنسيق التاريخ بشكل صحيح عند إرساله إلى قاعدة البيانات:
delphi
نسخ
تحرير
var
TodayDate: string;
begin
// تحويل التاريخ إلى التنسيق المطلوب (YYYY-MM-DD)
TodayDate := FormatDateTime('YYYY-MM-DD', Date);
// التحقق من عدم ترك الحقول فارغة
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// التأكد من استخدام TO_DATE عند إدخال التاريخ في Oracle
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) +
', TO_DATE(' + QuotedStr(TodayDate) + ', ''YYYY-MM-DD''))';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
شرح الحل
FormatDateTime('YYYY-MM-DD', Date);
يضمن أن TodayDate يتم تحويله إلى الصيغة الصحيحة YYYY-MM-DD.
استخدام TO_DATE() في جملة SQL
عند إدخال تاريخ في Oracle، يفضل استخدام TO_DATE('2025-02-28', 'YYYY-MM-DD') لتجنب الأخطاء.
نصيحة إضافية
إذا كنت تستخدم Oracle DATE، فقد يكون التخزين الداخلي يشمل الوقت أيضًا. يمكنك التأكد من حفظه بدون وقت باستخدام:
sql
نسخ
تحرير
TO_DATE('2025-02-28', 'YYYY-MM-DD HH24:MI:SS')
لكن إذا لم تكن بحاجة إلى الوقت، يكفي استخدام YYYY-MM-DD فقط.
النتيجة المتوقعة بعد الإصلاح
بعد تنفيذ التعديلات، سيتم إدخال التاريخ في قاعدة البيانات بدون مشاكل، وسيختفي الخطأ ORA-01861.
جرب الحل وأخبرني إذا استمرت المشكلة!
أنت قلت:
ماهو الخطأ هنا
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin: string;
TypeVacances: string;
IdEmploye: string;
begin
DateDebut := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
DateFin := FormatDateTime('yyyy-mm-dd', DateTimePicker2.Date);
TypeVacances := DBComboBox2.Text;
IdEmploye := DBEdit5.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' + // تعديل اسم العمود ليتناسب مع قاعدة البيانات
'VALUES ("' + DateDebut + '", "' + DateFin + '", "' + TypeVacances + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
هناك عدة أخطاء في كودك قد تؤدي إلى فشل التنفيذ وظهور أخطاء مثل ORA-00984 (column not allowed here) أو ORA-01861 (literal does not match format string). إليك المشاكل الرئيسية في الكود وتصحيحها:
الأخطاء في الكود:
استخدام " بدلاً من ' للقيم النصية
في SQL، Oracle لا يقبل القيم النصية داخل " بل يجب أن تكون داخل '.
يجب استخدام QuotedStr() بدلاً من إدخال النصوص مباشرةً.
عدم استخدام TO_DATE لتنسيق التواريخ بشكل صحيح
Oracle يتعامل مع التواريخ كـ DATE وليس كـ STRING، لذا يجب إدخالها باستخدام TO_DATE().
الحل: تصحيح الكود
delphi
نسخ
تحرير
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin, TypeVacances, IdEmploye: string;
begin
// تحويل القيم إلى تنسيق صحيح
DateDebut := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
DateFin := FormatDateTime('YYYY-MM-DD', DateTimePicker2.Date);
TypeVacances := Trim(DBComboBox2.Text); // إزالة أي فراغات زائدة
IdEmploye := Trim(DBEdit5.Text);
// التحقق من إدخال جميع القيم قبل التنفيذ
if (DateDebut = '') or (DateFin = '') or (TypeVacances = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// تعديل جملة SQL لاستخدام TO_DATE() و QuotedStr()
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDebut) + ', ''YYYY-MM-DD''), ' +
'TO_DATE(' + QuotedStr(DateFin) + ', ''YYYY-MM-DD''), ' +
QuotedStr(TypeVacances) + ', ' + QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
شرح التحسينات
Trim()
يزيل الفراغات الزائدة من المدخلات لتجنب القيم غير المرغوبة.
QuotedStr()
يضمن أن القيم النصية محاطة بعلامات اقتباس صحيحة 'value' لمنع أخطاء Oracle.
استخدام TO_DATE() عند إدخال التواريخ
يحول النص إلى نوع DATE الذي يتناسب مع قاعدة بيانات Oracle.
التحقق من أن جميع الحقول غير فارغة
يمنع الأخطاء عند ترك أحد الحقول فارغًا.
النتيجة المتوقعة بعد التصحيح
لن تواجه أخطاء مثل ORA-00984 و ORA-01861.
التواريخ سيتم إدخالها بصيغة صحيحة في Oracle.
الكود أكثر استقرارًا وسهل الصيانة.
جرب التعديلات وأخبرني إذا استمرت أي مشكلة!

أنت قلت:
ماذا عن هذا الكود
procedure TForm6.SpeedButton1Click(Sender: TObject);
var
IdEmploye, RaisonDemission: string;
DateDemission: string;
begin
IdEmploye := DBEdit5.Text;
DateDemission := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
RaisonDemission := DBEdit1.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Demissions (Date_Démission, Raison_Démission, Id_Employé) ' + // تعديل أسماء الأعمدة لتتناسب مع الجدول في قاعدة البيانات
'VALUES ("' + DateDemission + '", "' + RaisonDemission + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
الكود يحتوي على أخطاء برمجية قد تؤدي إلى أخطاء في التنفيذ عند التعامل مع قاعدة بيانات Oracle، وأهمها:
الأخطاء في الكود
استخدام علامات الاقتباس (") بدلًا من (') في SQL
Oracle لا يقبل "value" كقيمة نصية، بل يجب أن تكون 'value'.
الحل هو استخدام QuotedStr() عند تمرير القيم النصية في جملة INSERT.
عدم استخدام TO_DATE() عند إدراج التواريخ
Oracle يتعامل مع الحقول من النوع DATE باستخدام TO_DATE()، وليس كنص عادي.
إذا لم يتم استخدام TO_DATE()، فقد يؤدي ذلك إلى الخطأ ORA-01861 (literal does not match format string).
عدم التحقق من المدخلات قبل الإدراج
إذا ترك المستخدم أي حقل فارغ، قد يؤدي ذلك إلى إدخال بيانات غير صحيحة أو التسبب في أخطاء.
الحل: تصحيح الكود
delphi
نسخ
تحرير
procedure TForm6.SpeedButton1Click(Sender: TObject);
var
IdEmploye, RaisonDemission, DateDemission: string;
begin
// قراءة القيم من الحقول
IdEmploye := Trim(DBEdit5.Text);
DateDemission := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
RaisonDemission := Trim(DBEdit1.Text);
// التحقق من عدم ترك الحقول فارغة
if (IdEmploye = '') or (DateDemission = '') or (RaisonDemission = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// استخدام TO_DATE() و QuotedStr() لضمان إدراج القيم بشكل صحيح في Oracle
ADOQuery1.SQL.Text := 'INSERT INTO Demissions (Date_Démission, Raison_Démission, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDemission) + ', ''YYYY-MM-DD''), ' +
QuotedStr(RaisonDemission) + ', ' + QuotedStr(IdEmploye) + ')';
try
// تنفيذ الإدراج في قاعدة البيانات
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
شرح التحسينات
Trim() لتنظيف المدخلات
يزيل الفراغات الزائدة، ما يمنع إدخال بيانات غير صالحة.
QuotedStr() لحماية القيم النصية في SQL
يمنع الأخطاء الناتجة عن القيم النصية في Oracle.
استخدام TO_DATE() عند إدراج التواريخ
يضمن أن التواريخ يتم إدراجها في الصيغة الصحيحة YYYY-MM-DD.
التحقق من أن المدخلات غير فارغة قبل تنفيذ INSERT
يعرض رسالة للمستخدم إذا ترك أي حقل فارغ، مما يمنع الأخطاء عند الإدخال.
النتيجة المتوقعة بعد الإصلاح
✔ لن تواجه أخطاء مثل ORA-01861 أو ORA-00984.
✔ البيانات سيتم إدخالها في قاعدة البيانات بشكل صحيح دون مشاكل.
✔ التواريخ ستكون في التنسيق الصحيح المتوافق مع Oracle.
جرب هذا الحل وأخبرني إذا كنت بحاجة إلى مزيد من المساعدة!

أنت قلت:
ماذا عن هذا الكود
procedure TForm7.SpeedButton1Click(Sender: TObject);
var
DateRetraite, IdEmploye: string;
begin
DateRetraite := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
IdEmploye := DBEdit5.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Retraite (Date_Retraite, Id_Employé) ' +
'VALUES ("' + DateRetraite + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
الكود الذي كتبته يحتوي على أخطاء شائعة عند التعامل مع Oracle، مما قد يؤدي إلى ظهور أخطاء SQL مثل:
ORA-00984: column not allowed here بسبب استخدام " بدلاً من ' للقيم النصية.
ORA-01861: literal does not match format string بسبب عدم استخدام TO_DATE() عند إدراج التاريخ.
الأخطاء في الكود:
استخدام علامات الاقتباس المزدوجة (") للقيم النصية داخل SQL
Oracle لا يقبل "value"، بل يجب أن يكون 'value'.
يجب استخدام QuotedStr() عند تمرير القيم النصية إلى SQL.
عدم استخدام TO_DATE() عند إدخال التواريخ
Oracle يتعامل مع التواريخ باستخدام DATE وليس كنص VARCHAR.
يجب إدخال التواريخ باستخدام TO_DATE() لتجنب الأخطاء.
عدم التحقق من القيم قبل الإدخال
إذا كان IdEmploye فارغًا، فستحدث مشكلة عند تنفيذ INSERT.
الحل: تصحيح الكود
delphi
نسخ
تحرير
procedure TForm7.SpeedButton1Click(Sender: TObject);
var
DateRetraite, IdEmploye: string;
begin
// تحويل القيم إلى صيغة صحيحة
DateRetraite := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
IdEmploye := Trim(DBEdit5.Text);
// التحقق من إدخال القيم قبل التنفيذ
if (DateRetraite = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// تصحيح SQL باستخدام TO_DATE() و QuotedStr()
ADOQuery1.SQL.Text := 'INSERT INTO Retraite (Date_Retraite, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateRetraite) + ', ''YYYY-MM-DD''), ' +
QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
شرح التحسينات
Trim() لتنظيف المدخلات وإزالة الفراغات الزائدة.
QuotedStr() لضمان القيم النصية داخل SQL محاطة بعلامات اقتباس 'value'.
استخدام TO_DATE() عند إدخال التواريخ حتى تكون متوافقة مع Oracle.
التحقق من أن القيم غير فارغة قبل تنفيذ INSERT لتجنب الأخطاء.
النتيجة المتوقعة بعد الإصلاح
✔ لن تواجه أخطاء مثل ORA-00984 و ORA-01861.
✔ البيانات سيتم إدخالها في قاعدة البيانات بشكل صحيح دون مشاكل.
✔ الكود أكثر استقرارًا وسهل الصيانة.
جرب هذا الحل، وإذا واجهت أي مشكلة، أخبرني بذلك!

أنت قلت:
مادا عن هذا الكود
procedure TForm8.SpeedButton1Click(Sender: TObject);
var
DateTransfert: string;
IdEmploye: string;
begin
DateTransfert := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
IdEmploye := DBEdit5.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Transfer (Date_Transfer, Id_Employé) ' + // تعديل أسماء الأعمدة ليتناسب مع الجدول في قاعدة البيانات
'VALUES ("' + DateTransfert + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
الكود يحتوي على أخطاء شائعة عند التعامل مع Oracle، مما قد يؤدي إلى أخطاء SQL مثل:
ORA-00984: column not allowed here بسبب استخدام " بدلاً من ' للقيم النصية.
ORA-01861: literal does not match format string بسبب عدم استخدام TO_DATE() عند إدخال التاريخ.
ORA-00942: table or view does not exist إذا كان اسم الجدول Transfer غير صحيح، حيث أن كلمة TRANSFER قد تكون محجوزة في بعض إصدارات Oracle.
الأخطاء في الكود:
استخدام علامات الاقتباس المزدوجة (") بدلاً من (') للقيم النصية في SQL
Oracle لا يقبل "value"، بل يجب أن يكون 'value'.
يجب استخدام QuotedStr() عند تمرير القيم النصية إلى SQL.
عدم استخدام TO_DATE() عند إدخال التواريخ
Oracle يتعامل مع التواريخ كـ DATE، لذا يجب استخدام TO_DATE().
عدم التحقق من القيم قبل الإدخال
إذا كان IdEmploye أو DateTransfert فارغًا، فستحدث مشكلة عند تنفيذ INSERT.
استخدام اسم الجدول Transfer
TRANSFER قد يكون كلمة محجوزة في Oracle، لذا تأكد من أن الاسم صحيح. إذا كان محجوزًا، يمكنك تغييره أو استخدام اقتباسات مزدوجة "Transfer" عند تنفيذ SQL.
الحل: تصحيح الكود
delphi
نسخ
تحرير
procedure TForm8.SpeedButton1Click(Sender: TObject);
var
DateTransfert, IdEmploye: string;
begin
// تحويل القيم إلى صيغة صحيحة
DateTransfert := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
IdEmploye := Trim(DBEdit5.Text);
// التحقق من إدخال القيم قبل التنفيذ
if (DateTransfert = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// تصحيح SQL باستخدام TO_DATE() و QuotedStr()
ADOQuery1.SQL.Text := 'INSERT INTO "Transfer" (Date_Transfer, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateTransfert) + ', ''YYYY-MM-DD''), ' +
QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
شرح التحسينات
Trim()
يزيل الفراغات الزائدة من IdEmploye لضمان إدخال بيانات صحيحة.
QuotedStr()
يضمن أن القيم النصية داخل SQL محاطة بعلامات اقتباس 'value'.
استخدام TO_DATE() عند إدخال التواريخ
يضمن إدخال التواريخ بشكل صحيح في Oracle.
وضع "Transfer" بين اقتباسات مزدوجة
إذا كان TRANSFER كلمة محجوزة في Oracle، فإن استخدام "Transfer" سيجعلها تُفسر كاسم جدول.
يمكنك أيضًا تغيير اسم الجدول في قاعدة البيانات لتجنب المشكلة.
النتيجة المتوقعة بعد الإصلاح
✔ لن تواجه أخطاء مثل ORA-00984 و ORA-01861.
✔ البيانات سيتم إدخالها في قاعدة البيانات بشكل صحيح دون مشاكل.
✔ إذا كان Transfer كلمة محجوزة، فسيتم التعامل معها بشكل صحيح عبر "Transfer".
جرب هذا الحل، وإذا واجهت أي مشكلة، أخبرني بذلك!

أنت قلت:
في هدا الكود يجب ان يكون وقت البداية قبل وقت النهاية
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin, TypeVacances, IdEmploye: string;
begin
DateDebut := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
DateFin := FormatDateTime('YYYY-MM-DD', DateTimePicker2.Date);
TypeVacances := Trim(DBComboBox2.Text);
IdEmploye := Trim(DBEdit5.Text);
if (DateDebut = '') or (DateFin = '') or (TypeVacances = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
end;
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDebut) + ', ''YYYY-MM-DD''), ' +
'TO_DATE(' + QuotedStr(DateFin) + ', ''YYYY-MM-DD''), ' +
QuotedStr(TypeVacances) + ', ' + QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
لتجنب إدخال تاريخ بداية (DateDebut) بعد تاريخ نهاية (DateFin)، يجب إضافة شرط للتحقق من أن تاريخ البداية يأتي قبل تاريخ النهاية قبل تنفيذ عملية الإدخال.
التعديل على الكود: إضافة تحقق على ترتيب التواريخ
delphi
نسخ
تحرير
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin, TypeVacances, IdEmploye: string;
D1, D2: TDate;
begin
// تحويل التواريخ إلى نصوص بتنسيق متوافق مع Oracle
DateDebut := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
DateFin := FormatDateTime('YYYY-MM-DD', DateTimePicker2.Date);
TypeVacances := Trim(DBComboBox2.Text);
IdEmploye := Trim(DBEdit5.Text);
// تحويل النصوص إلى تواريخ للمقارنة
D1 := DateTimePicker1.Date;
D2 := DateTimePicker2.Date;
// التحقق من عدم ترك الحقول فارغة
if (DateDebut = '') or (DateFin = '') or (TypeVacances = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// التحقق من أن تاريخ البداية قبل تاريخ النهاية
if D1 >= D2 then
begin
ShowMessage('La date de début doit être avant la date de fin.');
Exit;
end;
// تنفيذ عملية الإدخال في قاعدة البيانات
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDebut) + ', ''YYYY-MM-DD''), ' +
'TO_DATE(' + QuotedStr(DateFin) + ', ''YYYY-MM-DD''), ' +
QuotedStr(TypeVacances) + ', ' + QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
ما الذي تم إضافته؟
تحويل القيم إلى نوع TDate للمقارنة
D1 := DateTimePicker1.Date;
D2 := DateTimePicker2.Date;
إضافة شرط التحقق من ترتيب التواريخ
delphi
نسخ
تحرير
if D1 >= D2 then
begin
ShowMessage('La date de début doit être avant la date de fin.');
Exit;
end;
يمنع إدخال تاريخ بداية (D1) يساوي أو يأتي بعد تاريخ نهاية (D2).
إيقاف التنفيذ باستخدام Exit إذا كانت التواريخ غير صحيحة
يمنع تنفيذ SQL INSERT إذا كانت القيم غير صحيحة.
قال ChatGPT:
الخطأ الذي يظهر لك هو ORA-00001: unique constraint violated، مما يعني أنك تحاول إدخال قيمة في جدول قاعدة بيانات أوراكل، ولكن هناك قيود UNIQUE أو PRIMARY KEY تمنع هذا الإدخال بسبب التكرار.
كيف تحل المشكلة ؟
تحقق من القيم المكررة
تأكد من أن القيمة التي تحاول إدخالها غير مكررة في الجدول، خاصة القيم التي تحتوي على مفتاح فريد (Unique Key) أو المفتاح الأساسي (Primary Key) مثل رقم الضمان الاجتماعي (Sécurité Sociale) أو ID Employé.
البحث عن القيد المسبب للمشكلة
نفذ الاستعلام التالي في SQL Developer أو أي أداة إدارة أوراكل لمعرفة تفاصيل القيد الفريد:
sql
نسخ
تحرير
SELECT constraint_name, table_name, column_name
FROM user_cons_columns
WHERE constraint_name = 'SYS_C007056';
هذا سيظهر لك اسم الجدول والأعمدة التي لديها هذا القيد.
التحقق من البيانات الموجودة في الجدول
استخدم الاستعلام التالي لمعرفة إن كانت القيمة التي تحاول إدخالها موجودة بالفعل:
sql
نسخ
تحرير
SELECT * FROM NOM_TABLE WHERE colonne_unique = 'valeur_que_tu_ajoutes';
استبدل NOM_TABLE باسم الجدول و colonne_unique باسم العمود الذي لديه القيد الفريد.
إزالة القيد (إذا كنت متأكدًا أن التكرار مطلوب)
إذا كنت تريد السماح بالقيم المكررة (وهو غير مستحسن في حالة المفاتيح الفريدة)، يمكنك إزالة القيد باستخدام:
sql
نسخ
تحرير
ALTER TABLE NOM_TABLE DROP CONSTRAINT SYS_C007056;
⚠ تحذير: إزالة القيد قد تؤدي إلى مشاكل في سلامة البيانات.
تصحيح الكود في دلفي
عند إضافة سجل جديد، تأكد أنك لا تضيف ID Employé يدويًا، بل اجعله Auto-Increment إذا كان ذلك ممكناً.
تحقق من أن البيانات التي تدخلها في النموذج غير مكررة.
قم بإضافة Try...Except في كود دلفي لالتقاط الخطأ وإعلام المستخدم بطريقة أكثر وضوحًا.
إذا استمرت المشكلة، شاركني بالكود الذي تستخدمه لإضافة البيانات في دلفي وسنبحث عن حل برمجي مناسب.
أنت قلت:
قال ChatGPT:
الخطأ ORA-01741: illegal zero-length identifier يشير إلى أنك تحاول إدخال قيمة فارغة ('') في أحد الأعمدة التي لا يمكن أن تكون فارغة (مثل الأعمدة التي تحتوي على contraintes NOT NULL).
كيف تحل المشكلة؟
1. التحقق من القيم الفارغة في الكود Delphi
من الصورة الثانية، الكود يحتوي على جملة SQL مثل:
delphi
نسخ
تحرير
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES ("' + DBEdit1.Text + '", "' + DBEdit5.Text + '", "' + TodayDate + '")';
هذه الجملة تحتوي على DBEdit1.Text و DBEdit5.Text التي قد تكون فارغة، مما يؤدي إلى هذا الخطأ.
2. تعديل الكود لمنع القيم الفارغة
أضف تحقق قبل تنفيذ INSERT، مثلاً:
delphi
نسخ
تحرير
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
3. استخدام QuotedStr بدلاً من "
في الجملة INSERT INTO, استخدم QuotedStr(DBEdit1.Text) بدلاً من '"' + DBEdit1.Text + '"' لأن QuotedStr يتعامل بشكل صحيح مع القيم الفارغة ويمنع الأخطاء في SQL.
4. التحقق من بنية الجدول في Oracle
نفذ الاستعلام التالي في Oracle SQL Developer:
sql
نسخ
تحرير
DESC Présence;
وتأكد من أن Id_Période و Identifiant_Employé لا تحتوي على قيد NOT NULL إذا كنت تريد إدخال قيم فارغة.
5. تأكيد البيانات في الجدول
قبل محاولة إدخال البيانات، تأكد من أن القيم غير فارغة:
sql
نسخ
تحرير
SELECT * FROM Présence WHERE Id_Période IS NULL OR Identifiant_Employé IS NULL;
إذا وجدت صفوفًا فارغة، فهذا يعني أن هناك خطأ سابق في إدخال البيانات.
تأكد من عدم ترك الحقول فارغة قبل التنفيذ.
استخدم QuotedStr بدلاً من " عند إدخال القيم النصية.
تحقق من القيم الفارغة في الجدول عبر SELECT.
أضف شرط NOT NULL إذا كنت لا تريد السماح بإدخال بيانات فارغة.
أنت قلت:
ما المعنى بـ TodayDate
قال ChatGPT:
في الكود الذي كتبته، TodayDate هو متغير من النوع string يُستخدم لتخزين تاريخ اليوم وإدخاله في قاعدة البيانات.
حاليًا، في الكود الخاص بك، لم يتم تعيين قيمة TodayDate قبل استخدامه، مما قد يؤدي إلى خطأ عند تنفيذ الاستعلام.
✔ الحل: تعيين TodayDate إلى تاريخ اليوم
قبل استخدام TodayDate في جملة SQL INSERT، يجب أن تحدد قيمته، على سبيل المثال:
delphi
نسخ
تحرير
var
TodayDate: string;
begin
TodayDate := FormatDateTime('yyyy-mm-dd', Date); // تحديد تاريخ اليوم بصيغة متوافقة مع Oracle
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
لأن Oracle يستخدم DATE بتنسيق YYYY-MM-DD.
هذا التنسيق يضمن أن البيانات تُخزن بشكل صحيح دون أخطاء في التوافق.
تعريف TodayDate كمتغير قبل الاستخدام.
إعطاؤه قيمة باستخدام FormatDateTime('yyyy-mm-dd', Date).
التأكد من استخدام QuotedStr عند تمريره في SQL لمنع الأخطاء.
جرب هذا الحل، وإذا استمرت المشكلة، شاركني برسالة الخطأ وسنحلها معًا!
أنت قلت:
قال ChatGPT:
الخطأ ORA-00984: column not allowed here في Oracle يشير إلى أنك تحاول استخدام اسم عمود في مكان غير مناسب في جملة SQL INSERT.
في Delphi، الكود يحتوي على جملة INSERT INTO غير صحيحة، حيث ربما:
يتم تمرير اسم عمود داخل VALUES بدلاً من تمرير قيمة.
يتم الخلط بين القيم النصية والأعمدة بدون استخدام QuotedStr.
يتم إدخال قيمة غير صالحة كحقل في قاعدة البيانات.
في كود Delphi، استبدل الجملة التالية:
delphi
نسخ
تحرير
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES ("' + DBEdit1.Text + '", "' + DBEdit5.Text + '", "' + TodayDate + '")';
بـالصيغة الصحيحة:
delphi
نسخ
تحرير
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
delphi
نسخ
تحرير
var
TodayDate: string;
begin
TodayDate := FormatDateTime('yyyy-mm-dd', Date); // ضبط تاريخ اليوم
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) + ', ' + QuotedStr(TodayDate) + ')';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
✔ استخدام QuotedStr لحماية القيم النصية عند تمريرها في SQL.
✔ عدم استخدام علامات الاقتباس المزدوجة " داخل SQL مباشرة، استخدم QuotedStr().
✔ التحقق من القيم الفارغة قبل الإدخال لتجنب الأخطاء الأخرى.
✔ ضبط تنسيق التاريخ بحيث يكون متوافقًا مع Oracle.
أنت قلت:
قال ChatGPT:
الخطأ ORA-01861: literal does not match format string يعني أن هناك مشكلة في تنسيق التاريخ الذي يتم إدخاله في قاعدة بيانات Oracle. أي أن القيمة النصية التي تمررها كـ date لا تتطابق مع التنسيق المتوقع من Oracle.
في Oracle، عند إدخال تاريخ نصيًا في INSERT INTO، يجب أن يتطابق مع التنسيق الذي يتوقعه النظام.
على سبيل المثال، إذا كان العمود Date_pre من النوع DATE، وأنت تمرر له نصًا بتنسيق غير متوقع، فسيحدث هذا الخطأ.
عليك التأكد من أن TodayDate يتبع تنسيق YYYY-MM-DD قبل إدراجه في قاعدة البيانات.
1. تصحيح الكود في Delphi
قم بتعديل الكود بحيث يتم تنسيق التاريخ بشكل صحيح عند إرساله إلى قاعدة البيانات:
delphi
نسخ
تحرير
var
TodayDate: string;
begin
// تحويل التاريخ إلى التنسيق المطلوب (YYYY-MM-DD)
TodayDate := FormatDateTime('YYYY-MM-DD', Date);
// التحقق من عدم ترك الحقول فارغة
if (Trim(DBEdit1.Text) = '') or (Trim(DBEdit5.Text) = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// التأكد من استخدام TO_DATE عند إدخال التاريخ في Oracle
ADOQuery1.SQL.Text := 'INSERT INTO Présence (Id_Période, Identifiant_Employé, Date_pre) ' +
'VALUES (' + QuotedStr(DBEdit1.Text) + ', ' + QuotedStr(DBEdit5.Text) +
', TO_DATE(' + QuotedStr(TodayDate) + ', ''YYYY-MM-DD''))';
try
ADOQuery1.ExecSQL;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
FormatDateTime('YYYY-MM-DD', Date);
يضمن أن TodayDate يتم تحويله إلى الصيغة الصحيحة YYYY-MM-DD.
استخدام TO_DATE() في جملة SQL
عند إدخال تاريخ في Oracle، يفضل استخدام TO_DATE('2025-02-28', 'YYYY-MM-DD') لتجنب الأخطاء.
إذا كنت تستخدم Oracle DATE، فقد يكون التخزين الداخلي يشمل الوقت أيضًا. يمكنك التأكد من حفظه بدون وقت باستخدام:
sql
نسخ
تحرير
TO_DATE('2025-02-28', 'YYYY-MM-DD HH24:MI:SS')
لكن إذا لم تكن بحاجة إلى الوقت، يكفي استخدام YYYY-MM-DD فقط.
بعد تنفيذ التعديلات، سيتم إدخال التاريخ في قاعدة البيانات بدون مشاكل، وسيختفي الخطأ ORA-01861.
أنت قلت:
ماهو الخطأ هنا
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin: string;
TypeVacances: string;
IdEmploye: string;
begin
DateDebut := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
DateFin := FormatDateTime('yyyy-mm-dd', DateTimePicker2.Date);
TypeVacances := DBComboBox2.Text;
IdEmploye := DBEdit5.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' + // تعديل اسم العمود ليتناسب مع قاعدة البيانات
'VALUES ("' + DateDebut + '", "' + DateFin + '", "' + TypeVacances + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
هناك عدة أخطاء في كودك قد تؤدي إلى فشل التنفيذ وظهور أخطاء مثل ORA-00984 (column not allowed here) أو ORA-01861 (literal does not match format string). إليك المشاكل الرئيسية في الكود وتصحيحها:
استخدام " بدلاً من ' للقيم النصية
في SQL، Oracle لا يقبل القيم النصية داخل " بل يجب أن تكون داخل '.
يجب استخدام QuotedStr() بدلاً من إدخال النصوص مباشرةً.
عدم استخدام TO_DATE لتنسيق التواريخ بشكل صحيح
Oracle يتعامل مع التواريخ كـ DATE وليس كـ STRING، لذا يجب إدخالها باستخدام TO_DATE().
delphi
نسخ
تحرير
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin, TypeVacances, IdEmploye: string;
begin
// تحويل القيم إلى تنسيق صحيح
DateDebut := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
DateFin := FormatDateTime('YYYY-MM-DD', DateTimePicker2.Date);
TypeVacances := Trim(DBComboBox2.Text); // إزالة أي فراغات زائدة
IdEmploye := Trim(DBEdit5.Text);
// التحقق من إدخال جميع القيم قبل التنفيذ
if (DateDebut = '') or (DateFin = '') or (TypeVacances = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// تعديل جملة SQL لاستخدام TO_DATE() و QuotedStr()
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDebut) + ', ''YYYY-MM-DD''), ' +
'TO_DATE(' + QuotedStr(DateFin) + ', ''YYYY-MM-DD''), ' +
QuotedStr(TypeVacances) + ', ' + QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
Trim()
يزيل الفراغات الزائدة من المدخلات لتجنب القيم غير المرغوبة.
QuotedStr()
يضمن أن القيم النصية محاطة بعلامات اقتباس صحيحة 'value' لمنع أخطاء Oracle.
استخدام TO_DATE() عند إدخال التواريخ
يحول النص إلى نوع DATE الذي يتناسب مع قاعدة بيانات Oracle.
التحقق من أن جميع الحقول غير فارغة
يمنع الأخطاء عند ترك أحد الحقول فارغًا.
لن تواجه أخطاء مثل ORA-00984 و ORA-01861.
التواريخ سيتم إدخالها بصيغة صحيحة في Oracle.
الكود أكثر استقرارًا وسهل الصيانة.
جرب التعديلات وأخبرني إذا استمرت أي مشكلة!
أنت قلت:
ماذا عن هذا الكود
procedure TForm6.SpeedButton1Click(Sender: TObject);
var
IdEmploye, RaisonDemission: string;
DateDemission: string;
begin
IdEmploye := DBEdit5.Text;
DateDemission := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
RaisonDemission := DBEdit1.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Demissions (Date_Démission, Raison_Démission, Id_Employé) ' + // تعديل أسماء الأعمدة لتتناسب مع الجدول في قاعدة البيانات
'VALUES ("' + DateDemission + '", "' + RaisonDemission + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
الكود يحتوي على أخطاء برمجية قد تؤدي إلى أخطاء في التنفيذ عند التعامل مع قاعدة بيانات Oracle، وأهمها:
استخدام علامات الاقتباس (") بدلًا من (') في SQL
Oracle لا يقبل "value" كقيمة نصية، بل يجب أن تكون 'value'.
الحل هو استخدام QuotedStr() عند تمرير القيم النصية في جملة INSERT.
عدم استخدام TO_DATE() عند إدراج التواريخ
Oracle يتعامل مع الحقول من النوع DATE باستخدام TO_DATE()، وليس كنص عادي.
إذا لم يتم استخدام TO_DATE()، فقد يؤدي ذلك إلى الخطأ ORA-01861 (literal does not match format string).
عدم التحقق من المدخلات قبل الإدراج
إذا ترك المستخدم أي حقل فارغ، قد يؤدي ذلك إلى إدخال بيانات غير صحيحة أو التسبب في أخطاء.
delphi
نسخ
تحرير
procedure TForm6.SpeedButton1Click(Sender: TObject);
var
IdEmploye, RaisonDemission, DateDemission: string;
begin
// قراءة القيم من الحقول
IdEmploye := Trim(DBEdit5.Text);
DateDemission := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
RaisonDemission := Trim(DBEdit1.Text);
// التحقق من عدم ترك الحقول فارغة
if (IdEmploye = '') or (DateDemission = '') or (RaisonDemission = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// استخدام TO_DATE() و QuotedStr() لضمان إدراج القيم بشكل صحيح في Oracle
ADOQuery1.SQL.Text := 'INSERT INTO Demissions (Date_Démission, Raison_Démission, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDemission) + ', ''YYYY-MM-DD''), ' +
QuotedStr(RaisonDemission) + ', ' + QuotedStr(IdEmploye) + ')';
try
// تنفيذ الإدراج في قاعدة البيانات
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
Trim() لتنظيف المدخلات
يزيل الفراغات الزائدة، ما يمنع إدخال بيانات غير صالحة.
QuotedStr() لحماية القيم النصية في SQL
يمنع الأخطاء الناتجة عن القيم النصية في Oracle.
استخدام TO_DATE() عند إدراج التواريخ
يضمن أن التواريخ يتم إدراجها في الصيغة الصحيحة YYYY-MM-DD.
التحقق من أن المدخلات غير فارغة قبل تنفيذ INSERT
يعرض رسالة للمستخدم إذا ترك أي حقل فارغ، مما يمنع الأخطاء عند الإدخال.
✔ لن تواجه أخطاء مثل ORA-01861 أو ORA-00984.
✔ البيانات سيتم إدخالها في قاعدة البيانات بشكل صحيح دون مشاكل.
✔ التواريخ ستكون في التنسيق الصحيح المتوافق مع Oracle.
جرب هذا الحل وأخبرني إذا كنت بحاجة إلى مزيد من المساعدة!
أنت قلت:
ماذا عن هذا الكود
procedure TForm7.SpeedButton1Click(Sender: TObject);
var
DateRetraite, IdEmploye: string;
begin
DateRetraite := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
IdEmploye := DBEdit5.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Retraite (Date_Retraite, Id_Employé) ' +
'VALUES ("' + DateRetraite + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
الكود الذي كتبته يحتوي على أخطاء شائعة عند التعامل مع Oracle، مما قد يؤدي إلى ظهور أخطاء SQL مثل:
ORA-00984: column not allowed here بسبب استخدام " بدلاً من ' للقيم النصية.
ORA-01861: literal does not match format string بسبب عدم استخدام TO_DATE() عند إدراج التاريخ.
استخدام علامات الاقتباس المزدوجة (") للقيم النصية داخل SQL
Oracle لا يقبل "value"، بل يجب أن يكون 'value'.
يجب استخدام QuotedStr() عند تمرير القيم النصية إلى SQL.
عدم استخدام TO_DATE() عند إدخال التواريخ
Oracle يتعامل مع التواريخ باستخدام DATE وليس كنص VARCHAR.
يجب إدخال التواريخ باستخدام TO_DATE() لتجنب الأخطاء.
عدم التحقق من القيم قبل الإدخال
إذا كان IdEmploye فارغًا، فستحدث مشكلة عند تنفيذ INSERT.
delphi
نسخ
تحرير
procedure TForm7.SpeedButton1Click(Sender: TObject);
var
DateRetraite, IdEmploye: string;
begin
// تحويل القيم إلى صيغة صحيحة
DateRetraite := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
IdEmploye := Trim(DBEdit5.Text);
// التحقق من إدخال القيم قبل التنفيذ
if (DateRetraite = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// تصحيح SQL باستخدام TO_DATE() و QuotedStr()
ADOQuery1.SQL.Text := 'INSERT INTO Retraite (Date_Retraite, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateRetraite) + ', ''YYYY-MM-DD''), ' +
QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
Trim() لتنظيف المدخلات وإزالة الفراغات الزائدة.
QuotedStr() لضمان القيم النصية داخل SQL محاطة بعلامات اقتباس 'value'.
استخدام TO_DATE() عند إدخال التواريخ حتى تكون متوافقة مع Oracle.
التحقق من أن القيم غير فارغة قبل تنفيذ INSERT لتجنب الأخطاء.
✔ لن تواجه أخطاء مثل ORA-00984 و ORA-01861.
✔ البيانات سيتم إدخالها في قاعدة البيانات بشكل صحيح دون مشاكل.
✔ الكود أكثر استقرارًا وسهل الصيانة.
جرب هذا الحل، وإذا واجهت أي مشكلة، أخبرني بذلك!
أنت قلت:
مادا عن هذا الكود
procedure TForm8.SpeedButton1Click(Sender: TObject);
var
DateTransfert: string;
IdEmploye: string;
begin
DateTransfert := FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date);
IdEmploye := DBEdit5.Text;
ADOQuery1.SQL.Text := 'INSERT INTO Transfer (Date_Transfer, Id_Employé) ' + // تعديل أسماء الأعمدة ليتناسب مع الجدول في قاعدة البيانات
'VALUES ("' + DateTransfert + '", "' + IdEmploye + '")';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
الكود يحتوي على أخطاء شائعة عند التعامل مع Oracle، مما قد يؤدي إلى أخطاء SQL مثل:
ORA-00984: column not allowed here بسبب استخدام " بدلاً من ' للقيم النصية.
ORA-01861: literal does not match format string بسبب عدم استخدام TO_DATE() عند إدخال التاريخ.
ORA-00942: table or view does not exist إذا كان اسم الجدول Transfer غير صحيح، حيث أن كلمة TRANSFER قد تكون محجوزة في بعض إصدارات Oracle.
استخدام علامات الاقتباس المزدوجة (") بدلاً من (') للقيم النصية في SQL
Oracle لا يقبل "value"، بل يجب أن يكون 'value'.
يجب استخدام QuotedStr() عند تمرير القيم النصية إلى SQL.
عدم استخدام TO_DATE() عند إدخال التواريخ
Oracle يتعامل مع التواريخ كـ DATE، لذا يجب استخدام TO_DATE().
عدم التحقق من القيم قبل الإدخال
إذا كان IdEmploye أو DateTransfert فارغًا، فستحدث مشكلة عند تنفيذ INSERT.
استخدام اسم الجدول Transfer
TRANSFER قد يكون كلمة محجوزة في Oracle، لذا تأكد من أن الاسم صحيح. إذا كان محجوزًا، يمكنك تغييره أو استخدام اقتباسات مزدوجة "Transfer" عند تنفيذ SQL.
delphi
نسخ
تحرير
procedure TForm8.SpeedButton1Click(Sender: TObject);
var
DateTransfert, IdEmploye: string;
begin
// تحويل القيم إلى صيغة صحيحة
DateTransfert := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
IdEmploye := Trim(DBEdit5.Text);
// التحقق من إدخال القيم قبل التنفيذ
if (DateTransfert = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// تصحيح SQL باستخدام TO_DATE() و QuotedStr()
ADOQuery1.SQL.Text := 'INSERT INTO "Transfer" (Date_Transfer, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateTransfert) + ', ''YYYY-MM-DD''), ' +
QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
Trim()
يزيل الفراغات الزائدة من IdEmploye لضمان إدخال بيانات صحيحة.
QuotedStr()
يضمن أن القيم النصية داخل SQL محاطة بعلامات اقتباس 'value'.
استخدام TO_DATE() عند إدخال التواريخ
يضمن إدخال التواريخ بشكل صحيح في Oracle.
وضع "Transfer" بين اقتباسات مزدوجة
إذا كان TRANSFER كلمة محجوزة في Oracle، فإن استخدام "Transfer" سيجعلها تُفسر كاسم جدول.
يمكنك أيضًا تغيير اسم الجدول في قاعدة البيانات لتجنب المشكلة.
✔ لن تواجه أخطاء مثل ORA-00984 و ORA-01861.
✔ البيانات سيتم إدخالها في قاعدة البيانات بشكل صحيح دون مشاكل.
✔ إذا كان Transfer كلمة محجوزة، فسيتم التعامل معها بشكل صحيح عبر "Transfer".
جرب هذا الحل، وإذا واجهت أي مشكلة، أخبرني بذلك!
أنت قلت:
في هدا الكود يجب ان يكون وقت البداية قبل وقت النهاية
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin, TypeVacances, IdEmploye: string;
begin
DateDebut := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
DateFin := FormatDateTime('YYYY-MM-DD', DateTimePicker2.Date);
TypeVacances := Trim(DBComboBox2.Text);
IdEmploye := Trim(DBEdit5.Text);
if (DateDebut = '') or (DateFin = '') or (TypeVacances = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
end;
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDebut) + ', ''YYYY-MM-DD''), ' +
'TO_DATE(' + QuotedStr(DateFin) + ', ''YYYY-MM-DD''), ' +
QuotedStr(TypeVacances) + ', ' + QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
قال ChatGPT:
لتجنب إدخال تاريخ بداية (DateDebut) بعد تاريخ نهاية (DateFin)، يجب إضافة شرط للتحقق من أن تاريخ البداية يأتي قبل تاريخ النهاية قبل تنفيذ عملية الإدخال.
delphi
نسخ
تحرير
procedure TForm5.SpeedButton1Click(Sender: TObject);
var
DateDebut, DateFin, TypeVacances, IdEmploye: string;
D1, D2: TDate;
begin
// تحويل التواريخ إلى نصوص بتنسيق متوافق مع Oracle
DateDebut := FormatDateTime('YYYY-MM-DD', DateTimePicker1.Date);
DateFin := FormatDateTime('YYYY-MM-DD', DateTimePicker2.Date);
TypeVacances := Trim(DBComboBox2.Text);
IdEmploye := Trim(DBEdit5.Text);
// تحويل النصوص إلى تواريخ للمقارنة
D1 := DateTimePicker1.Date;
D2 := DateTimePicker2.Date;
// التحقق من عدم ترك الحقول فارغة
if (DateDebut = '') or (DateFin = '') or (TypeVacances = '') or (IdEmploye = '') then
begin
ShowMessage('Veuillez remplir tous les champs obligatoires.');
Exit;
end;
// التحقق من أن تاريخ البداية قبل تاريخ النهاية
if D1 >= D2 then
begin
ShowMessage('La date de début doit être avant la date de fin.');
Exit;
end;
// تنفيذ عملية الإدخال في قاعدة البيانات
ADOQuery1.SQL.Text := 'INSERT INTO Vacances (Date_Début, Date_Fin, Type_Vacances, Id_Employé) ' +
'VALUES (TO_DATE(' + QuotedStr(DateDebut) + ', ''YYYY-MM-DD''), ' +
'TO_DATE(' + QuotedStr(DateFin) + ', ''YYYY-MM-DD''), ' +
QuotedStr(TypeVacances) + ', ' + QuotedStr(IdEmploye) + ')';
try
ADOQuery1.ExecSQL;
// تحديث البيانات بعد الإدخال
DataSource1.DataSet.Close;
DataSource1.DataSet.Open;
ShowMessage('Les données ont été enregistrées avec succès.');
except
on E: Exception do
ShowMessage('Erreur lors de l''enregistrement des données : ' + E.Message);
end;
end;
تحويل القيم إلى نوع TDate للمقارنة
D1 := DateTimePicker1.Date;
D2 := DateTimePicker2.Date;
إضافة شرط التحقق من ترتيب التواريخ
delphi
نسخ
تحرير
if D1 >= D2 then
begin
ShowMessage('La date de début doit être avant la date de fin.');
Exit;
end;
يمنع إدخال تاريخ بداية (D1) يساوي أو يأتي بعد تاريخ نهاية (D2).
إيقاف التنفيذ باستخدام Exit إذا كانت التواريخ غير صحيحة
يمنع تنفيذ SQL INSERT إذا كانت القيم غير صحيحة.