الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

عملية نسخ محتوى سجل ولصقها كمحتوى سجل اخر

بدأه medreg في 20 يناير 2012 · 13 رد · 1,302 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

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

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

مثل ماهو موضح في الصورة

علما انني استعمل لغة الدلفي7 وابسوليت داتاباز

post-95467-072933900 1327073274_thumb.jp

المرفقات
COPYCOLLER.JPG
#2

السلام عليكم

اوضح السؤال من فضلك!!!

#3
c_vita كتب:

السلام عليكم

اوضح السؤال من فضلك!!!

السلام عليكم اخي

ساوضح لك اكثر

لدي سجل يحتوي على المعلومات التالية

حقل الرمز : يحتوي على رقم ' 1 '

حقل الاسم : يحتوي على اسم ' محمد '

حقل اللقب : يحتوي على ' عثمان '

السؤال او الطلب هو انن اردت ان اضيف سجل اخر برقم اخر لكن يحتوي على نفس المعلومات التي بالسجل رقم ' 1 ' وليس بالضرورة يكون السجل رقم ' 1 ' ربما يكون من سجل اخر المهم ان المعلومات التي اريد ان اضعها في السجل الجديد تكون موجودة بسجل اخر

والمعلومات هي حقل الاسم الدي يحتوي على اسم ' محمد ' وحقل اللقب الذي يحتوي على ' عثمان '

بمعنى السجلان رقم ' 1 ' ورقم ' 2 ' يحملاني نفس المعلومات والفرق بينهما هو حقل الرمز الي هو المفتاح

ارجو ان اكون قد وفقت في التوضيح

اليكم هذا المرفق للتعديل عيه من فضلكم

TesteCopierColler.rar

#4

السلام عليكم

اخي " مدرق " أولا ليس لدي نوعية قاعدة البيانات التى تستخدمها انت.

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

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

أنا في العادة استخدم السجلات للتعامل مع الجداول التي يكون فيها عمليات حسابية أو عمليات من نوع العملية التي تريدها - طبعا حسب ما لدي من معرفة -

في مثل حالتك يمكنك انشاء سجل يحمل نفس بيانات الجدول الذي بين يديك كالتالي:

type
TCustRecord=record
  Code:Integer;
  Nom, PreNom, F_nction:string;
end;

وفي تعريف المتغيرات تعرف متغير من نوع السجل بالاعلى
CustRec:TCustRecord;

تقوم بنسخ الحقول المراد نسخها من السجل السابق

وبعد تهيئة السجل الجديد تقوم بأسناد القيم الموجودة التي تم اخذها الى الحقول الجديدة وتدخل باقي البيانات

وتحفظ الجدول ..

جرب واخبرني بالنتيجة

على فكرة حاول عندما ترفع مشروع ما لا داعي لرفع الملف التنفيذي معه.. فقط ارفع السورس

تقبل تحياتي ......

#5

اكمل الكود من فضلك

كيف يتم ذلك

اقصد ماذا اضع في زر النسخ وزر اللصق

#6

السلام عليكم...

الشكر لأخينا c_vita.

في القسم interface تحت عبارة type ضع التعريف التالي:

type

// التصريح عن نوع بيانات
  TCustRecord = record
      Code:Integer;
      CopyDone: Boolean;
      Nom, Prenom, Fonction: string;
  end;

  TForm1 = class(TForm)
    D1: TDataSource;
    // ...
    // ...
    // ...
  end;

في القسم implementation - مثلاً - قم بتعريف متغير من النوع TCustRecord كالتالي:

implementation

{$R *.dfm}

var
    CustData: TCustRecord;    // التصريح عن المتغير

كود زر النسخ:

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
    if not ADOTable1.IsEmpty then begin
        if ADOTable1.FieldByName('Nom').IsNull then
            CustData.Nom := ''
        else
            CustData.Nom := ADOTable1.FieldByName('Nom').AsString;

        if ADOTable1.FieldByName('Prenom').IsNull then
            CustData.Prenom := ''
        else
            CustData.Prenom := ADOTable1.FieldByName('Prenom').AsString;

        if ADOTable1.FieldByName('Fonction').IsNull then
            CustData.Fonction := ''
        else
            CustData.Fonction := ADOTable1.FieldByName('Fonction').AsString;

        CustData.CopyDone := True;
    end;
end;

كود زر اللصق:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    if (ADOTable1.State in [dsEdit, dsInsert]) and CustData.CopyDone then begin
        ADOTable1.FieldByName('Nom').AsString := CustData.Nom;
        ADOTable1.FieldByName('Prenom').AsString := CustData.Prenom;
        ADOTable1.FieldByName('Fonction').AsString := CustData.Fonction;
    end;
end;

** لاحظ أن اللصق يتم فقط إذا كان الجدول في حالة إضافة أو تعديل. أي:

1. انسخ السجل الذي تريد تكراره.

2. انقر زر الإضافة أو زر التعديل في المكون DBNavigator لإنشاء سجل جديد أو البدء في تعديل السجل الحالي.

3. انقر زر اللصق لإدراج البيانات المنسوخة.

4. انقر زر الحفظ في المكون DBNavigator لحفظ البيانات.

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#7

السلام عليكم ورحمة الله تعالى وبركاته

لقد وضعت هذه التعريفات التي طلبت مني ان اضيفها

type
  TCustRecord = record
  Cd_Pers, PS_Identifiant:Integer;
  Presume, CopyDone: Boolean;
  LB_Pers, FNOM, PNOM, LX_NS, ST_FML, SS_NM, MU_NM, Cle, NU_Cpte, SEXE, Type_IEP, ModeCalcule: string;
  DT_EN, DT_SR, DT_NS : TDate;
end;
  TFrm_RapPers = class(TForm)

ثم وضعت هذا

implementation

uses UDM, UFiche_Paye, UParam, UMotif, UListePers, UFiche_Rap;

{$R *.dfm}
var
    CustData: TCustRecord;

وانشأت جدول جديد مؤقت وسميته TTempRapPers

ثم في الحدث لزر النسخ وضعت هذا

procedure TFrm_RapPers.BitBtnCopierClick(Sender: TObject);
begin
  with DM do
  begin
    if not TTempRapPers.IsEmpty then
    begin
        if TTempRapPers.FieldByName('PS_Identifiant').IsNull then
            CustData.PS_Identifiant :=0
        else
            CustData.PS_Identifiant := TTempRapPers.FieldByName('PS_Identifiant').AsInteger;

        if TTempRapPers.FieldByName('LB_Pers').IsNull then
            CustData.LB_Pers := ''
        else
            CustData.LB_Pers := TTempRapPers.FieldByName('LB_Pers').AsString;

        if TTempRapPers.FieldByName('Presume').IsNull then
            CustData.Presume := False
        else
            CustData.Presume := TTempRapPers.FieldByName('Presume').Value;

        if TTempRapPers.FieldByName('PNOM').IsNull then
            CustData.PNOM := ''
        else
            CustData.PNOM := TTempRapPers.FieldByName('PNOM').AsString;

        if TTempRapPers.FieldByName('FNOM').IsNull then
            CustData.FNOM := ''
        else
            CustData.FNOM := TTempRapPers.FieldByName('FNOM').AsString;

        if TTempRapPers.FieldByName('LX_NS').IsNull then
            CustData.LX_NS := ''
        else
            CustData.LX_NS := TTempRapPers.FieldByName('LX_NS').AsString;

        if TTempRapPers.FieldByName('ST_FML').IsNull then
            CustData.ST_FML := ''
        else
            CustData.ST_FML := TTempRapPers.FieldByName('ST_FML').AsString;

        if TTempRapPers.FieldByName('SS_NM').IsNull then
            CustData.SS_NM := ''
        else
            CustData.SS_NM := TTempRapPers.FieldByName('SS_NM').AsString;

        if TTempRapPers.FieldByName('MU_NM').IsNull then
            CustData.MU_NM := ''
        else
            CustData.MU_NM := TTempRapPers.FieldByName('MU_NM').AsString;

        if TTempRapPers.FieldByName('Cle').IsNull then
            CustData.Cle := ''
        else
            CustData.Cle := TTempRapPers.FieldByName('Cle').AsString;

        if TTempRapPers.FieldByName('NU_Cpte').IsNull then
            CustData.NU_Cpte := ''
        else
            CustData.NU_Cpte := TTempRapPers.FieldByName('NU_Cpte').AsString;

        if TTempRapPers.FieldByName('SEXE').IsNull then
            CustData.SEXE := ''
        else
            CustData.SEXE := TTempRapPers.FieldByName('SEXE').AsString;

        if TTempRapPers.FieldByName('Type_IEP').IsNull then
            CustData.Type_IEP := ''
        else
            CustData.Type_IEP := TTempRapPers.FieldByName('Type_IEP').AsString;

        if TTempRapPers.FieldByName('ModeCalcule').IsNull then
            CustData.ModeCalcule := ''
        else
            CustData.ModeCalcule := TTempRapPers.FieldByName('ModeCalcule').AsString;

        if TTempRapPers.FieldByName('DT_EN').IsNull then
            CustData.DT_EN := Null
        else
            CustData.DT_EN := TTempRapPers.FieldByName('DT_EN').AsDateTime;

        if TTempRapPers.FieldByName('DT_NS').IsNull then
            CustData.DT_NS := Null
        else
            CustData.DT_NS := TTempRapPers.FieldByName('DT_NS').AsDateTime;

        if TTempRapPers.FieldByName('DT_SR').IsNull then
            CustData.DT_SR := Null
        else
            CustData.DT_SR := TTempRapPers.FieldByName('DT_SR').AsDateTime;
        CustData.CopyDone := True;
    end;
  end;
end;

وفي الحدث لزر اللصق وضعت هذا الكود

procedure TFrm_RapPers.BitBtnCollerClick(Sender: TObject);
begin
  with DM do
  begin
    if (TRapPers.State in [dsEdit, dsInsert]) and CustData.CopyDone then
    begin
      TRapPers.FieldByName('PS_Identifiant').AsInteger := CustData.PS_Identifiant;
      TRapPers.FieldByName('LB_Pers').AsString := CustData.LB_Pers;
      TRapPers.FieldByName('Presume').Value := CustData.Presume ;
      TRapPers.FieldByName('PNOM').AsString := CustData.PNOM ;
      TRapPers.FieldByName('FNOM').AsString := CustData.FNOM ;
      TRapPers.FieldByName('LX_NS').AsString := CustData.LX_NS;
      TRapPers.FieldByName('ST_FML').AsString := CustData.ST_FML;
      TRapPers.FieldByName('SS_NM').AsString := CustData.SS_NM;
      TRapPers.FieldByName('MU_NM').AsString := CustData.MU_NM;
      TRapPers.FieldByName('Cle').AsString := CustData.Cle;
      TRapPers.FieldByName('NU_Cpte').AsString := CustData.NU_Cpte ;
      TRapPers.FieldByName('SEXE').AsString := CustData.SEXE ;
      TRapPers.FieldByName('Type_IEP').AsString := CustData.Type_IEP;
      TRapPers.FieldByName('ModeCalcule').AsString := CustData.ModeCalcule ;
      TRapPers.FieldByName('DT_EN').AsDateTime := CustData.DT_EN ;
      TRapPers.FieldByName('DT_NS').AsDateTime := CustData.DT_NS ;
      TRapPers.FieldByName('DT_SR').AsDateTime := CustData.DT_SR ;
    end;
      If TRapPers.State=dsedit then TRapPers.Post;
  end;
end;

end.

عندما اضغط على زر النسخ لا اعرف ان كان ثد تم النسخ ام لا المهم انه لا يعطيني اية رسالة

وعندما انشأ سجل جديد واضغط على زر اللصق لايتم لصق المعطيات ولا يظهر اي رسالة

اذا اين يكمن الخطأ

أو ماذا ينقص هذا الكود

#8

السلام عليكم

الاخ مدرق

1- يمكن ان تضيف زر آخر - مؤقت - وتكتب فيه مثلا:

if CustData.DT_SR = Null then
ShowMessage(' DT_SR is null');

لتختبر متغير عشوائي للتأكد من ان البيانات قد تم نسخها .

2- أو -فليصححني من يرى اني أخطأت- استعمل الــ Value بدلا من ASxxxxxx

بالاضافة المحولات : Datetostr strtoint floattostr .....ets

واجهتني بعض المشاكل من عدم الحفظ للبيانات من قبل وكان الحل في رقم 2

بالتوفيق وتقبل تحياتي

#9

جزاكم الله عنا كل خير

وبارك الله فيك

#10

السلام عليكم

اقتباس

جزاكم الله عنا كل خير

وبارك الله فيك

الاخ مدرق ارجو توضيح ما حصل لك للفائدة العامة

#11

لقد استعملت كود آخر وهو عبارة عن متغيرات من دون انشاء جدول مؤقت ونجحت العملية معي

وهذا هو الكود الذي استعملته

procedure TFrm_RapPers.BitBtnCopierClick(Sender: TObject);
begin 
Lb01 := DBEdit2.Text; 
Lb12 := Radio_TypeIEP.Value; 
Lb05 := DBEdit8.Text; 
Lb06 := DBEdit9.Text; 
Lb08 := DBEdit11.Text; 
Lb07 := DBEdit10.Text; 
Lb04 := DBEdit6.Text; 
Lb02 := DBEdit19.Text; 
Lb03 := DBEdit18.Text; 
Lb09 := RadioSexe.Value; 
Lb11 := Radio_Calcule.value; 
Code := strtoint(DBEdit20.Text); 
DT02 := strtodate(DBEdit49.text); 
Prsm := Check_Presume.Checked; 
DT01 := strtodate(DBEdit5.Text); 
Lb10 := DBRadioGroup_STFAM.value; 
end; 

procedure TFrm_RapPers.BitBtnCollerClick(Sender: TObject); 
begin 
DM.TRapPers.Open; 
DM.TRapPers.edit;
DM.TRapPers.Insert; 
DM.TRapPersLB_Pers.Value := Lb01; 
DM.TRapPersType_IEP.Value := Lb12; 
DM.TRapPersSS_NM.Value := Lb05; 
DM.TRapPersMU_NM.Value := Lb06; 
DM.TRapPersCle.Value := Lb08; 
DM.TRapPersNu_Cpte.Value := Lb07; 
DM.TRapPersLX_NS.Value := Lb04; 
DM.TRapPersPNOM.Value := Lb02; 
DM.TRapPersFNOM.Value := Lb03; 
DM.TRapPersSEXE.Value := Lb09; 
DM.TRapPersModeCalcule.Value := Lb11; 
DM.TRapPersST_FML.Value := Lb10; 
DM.TRapPersPS_Identifiant.Value := strtoint(Code); 
DM.TRapPersPresume.Value := Prsm; 
DM.TRapPersDT_EN.asdatetime := strtodate(DT02); 
DM.TRapPersDT_NS.asdatetime := strtodate(DT01); 
DM.TRapPers.Post; 
end;

وبالتوفيق

لكل من ساعدني واراد بهذا الفائدة العامة جزاه وجزاكم الله عنا كل خير

تم تعديل هذه المشاركة بواسطة medreg في 3 فبراير 2012 في 23:57

#12

وها انا قد رفعت الكود لتعم الفائدة

#13

وعليكم السلام ورحمة الله وبركاته

برأي أن أفضل طريقة لذلك باستخدام AppendRecord المعرف على مستوى TDataSet (وبالتالي أتوقع أن يكون في Absolute Database أيضا)

يأخذ الإجراء مجموعة من الثوابت غير ذات النمط، يمكن استخدام نمط TVarRec لتخزين القيم مثلا

مثال Matt Harrison يستخدم الإجراء ذاته لإعادة كتابة نفس السطر من جدول:

Author: Matt Harrison

Homepage: http://www.delphi3000.com/articles/article_1216.asp?SK=

procedure DuplicateCurrentRecord(aDataSet : TDataSet);
var
  Data : array of variant;
  aRecord : array of TVarRec;
  i : integer;
  max : integer;
begin
  max := aDataSet.fields.count -1;
  // set the lenghth of the arecord array to be the same as the number of
  // elements in the data array
  SetLength(arecord,max+1);
  SetLength(data,max+1);

  // set the variant type pointers to the data array
  for i := 0 to max do
  begin
    arecord.VType := vtVariant;
    arecord.VVariant := @data;
  end;

  // Copy the Record to the Array
  for i := 0 to max do
    Data := aDataSet.fields.value;

  // finally append the record in one go
  aDataSet.AppendRecord(aRecord);
end;

بالتوفيق.

#14

اشكرك اخي على المعلومة القييمة

وجزاك الله عنا خير الجزاء

ووفقكم الله لما يحبه ويرضاه

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…