فتح الملف النصي لـ Virement CCP في StringGrid
#1
باسم الله الرحمان الرحيم

السلام عليكم

وتقبل الله صيامكم و قيامكم

[صورة مرفقة: 657834394.png]

نظرا لضيق الوقت سأتطرق إلى أهم الامور في المثال :  من جهتي أحب البساطة لكي يفهمها أي شخص
PHP كود :
function Cle(const  Type_CleCompte_CCPstring): string;
var
  IByte;
begin
  Result 
:= '0';

  if Type_Cle 'RIP' then begin

     
for := Length(Compte_CCPdownto 1 do
     Result := IntToStrStrToInt(Result) + StrToInt(Compte_CCP[I]) * (Length(Compte_CCP) - 4) );
     result := IntToStrStrToInt(Resultmod 100 );

  end;

  if Type_Cle 'OLD' then begin

  result 
:=IntToStr(  97 - ((((StrToInt(Compte_CCPmod 97) * 3 mod 97) + 85mod 97)   );

  end;


   if Length(Result) = 1 then  Result :=  '0'+  Result;

end

ـ أول شيء حساب المفتاح لرقم الحساب ،  يوجد موضوع يتحدث على ذلك من هنا

* أولا function Cle تقوم بحساب المفتاح RIP أو القديم OLD كمثال تكون الكتابة الكتالي
PHP كود :
  Edit4.Text :=  Cle('RIP',Edit3.Text) ;
  Edit5.Text :=  Cle('OLD',Edit3.Text) ; 

الشيء الثاني فتح الملف نصي نصرح به TextFile ثم نعطيه مسار الملف AssignFile(اسم الملف المصرح به, مسار الملف)  و بعدها فتحه Reset

لكي نقرأ السطر نكتب ReadLn و لكتبنا مرة اخر ReadLn ينقلنا للسطر الثاني وهكذا تواليك ، عذرا أنا أختصر .

لتسهيل عملية قراء السطر كتبت الدالة التالية function LireText سرحت بها على أنها record تحتوي على الحساب و المفتاح و الاسم و المبلغ

التسريح بالسجل
PHP كود :
type
 TextRecord 
record
 COMPTE
,CLE,NOM_PRENOMstring;
 
MONTANTreal;
end

الدالة لقراءة السطر
PHP كود :
function LireText (const LigneTextestring): TextRecord;
begin

 result
.COMPTE := intTOstr(strTOintcopy(LigneTexte,10,10) ));
 
result.CLE := copy(LigneTexte,20,2);
 
result.MONTANT := strTOfloat(copy(LigneTexte,22,13)) / 100;
 
result.NOM_PRENOM := Trim(  copy(LigneTexte,35,27)  );

end

مثال الاحضار رقم الحساب من السطر إلى خلية من StringGrid1
PHP كود :
    StringGrid1.Cells[1,i] := LireText(ligne).COMPTE 

بالنسبة لـ StringGrid1 وضعت في الاحداث في DrawCell ، محذات رقم الحساب و المبلغ إى اليمين ، ومقارنة المفتاح إذا وجد من القديم يتركه بلون أبيض و RIP باللون الاخضر و خاطئ بالاحمر

حمل المثال من المرفقات

أي إستفسار سأحاول الاجابة عنه في اقرب وقت

يرجى تصحيح كما في الصورة 21 إلى 20

[صورة مرفقة: 543325496.png]

لم الاحظ الخطأ أثناء جلب المفتاح السطر الاول .إلا فيما بعد ، يرجى تصحيحه


الملفات المرفقة
.rar   Import txt D7.rar (الحجم : 205.53 KB / التحميلات : 18)
[-] كل من 3 users say قال شكرا ل larbiparadox على المشاركة المفيدة
  • onexite, أبو معاذ, لؤي
الرد
#2
بارك الله فيك وصح لفطورك
ملاحظة لقد وجدت خطأ صغير لا اعرف انك متعمد حتى تدرك اننا قد راجعن الدرس ام انك غير متعمد
والخطأ هو في الدالة
if Type_Cle = 'RIP' then begin
و
if Type_Cle = 'OLD' then begin
انت وضعت التعريف الأول في الدالة على أنه RIP
والتعريف الثاني على انه OLD
والصحيح هو ان التعريف الأول هو OLD
والثاني هو RIP
هل صح ما اقول ام غلط
الرد
#3
شكرا هذا خاص بـ RIP

PHP كود :
result :=IntToStr(  97 - ((((StrToInt(Compte_CCPmod 97) * 3 mod 97) + 85mod 97)   ); 

(12-05-2020, 08:36 AM)larbiparadox كتب : شكرا هذا خاص بـ RIP

PHP كود :
result :=IntToStr(  97 - ((((StrToInt(Compte_CCPmod 97) * 3 mod 97) + 85mod 97)   ); 

شكرا على ملاحظة الخطأ ، لم أتعمده خطأ مطبعي

المثال المصحح في المرفقات


الملفات المرفقة
.rar   Import txt2 D7.rar (الحجم : 205.51 KB / التحميلات : 31)
الرد
#4
يوجد خطأ عند التنفيذ


الملفات المرفقة
.png   Sans titre.png (الحجم : 17.79 KB / التحميلات : 16)
وقل ربي زدني علماً
الرد
#5
السلام عليكم ورحمة الله يا اخي bouh25
صح لفطورك بااك راك مازال صايم مافطرتش
هههههههههه
راني نقصر برك
المرفق يعمل بشكل جيد لقد حملته ونفذته وتم التنفيذ بشكل جيد
الرد
#6
تقبل الله صيامكم

بالفعل البرنامج يعطي خطأ مع الملف النصي المرفق مع السورس

ولكن مالفائده من تحويل الملف النصي إلى البرنامج هل قصد التصحيح أم ماذا؟

ما أعرفه هو تحويل العكس أي إلى ملف نصي ليتم نسخه على القرص المضغوط

هل ممكن كيف يتم التحويل من الإكسيل إلى ملف نصي مع التنبيه إلى الحسابات المكررة

أريد أن أتعلم كيف يتم التنبيه إلى الحسابات المتكررة كيف يتم ذلك؟
الرد
#7
السلام عليكم

أحاول أن أًحول التحويل من ملف الاكسيل  إلى ملف نصي تم التحويل من الاكسيل إلى stringGrid والان عندي مشكل مع الـ format()

هل من إقتراحات


كود :
type
  TForm3 = class(TForm)
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button2: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private declarations }
      ExcelFile,sheet : Variant;
      procedure OpenExcelFile;


  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
Var

     MaxRow, MaxCol,i,j:Integer;
begin
   OpenExcelFile;
   MaxRow := Sheet.Usedrange.Rows.count ;
  MaxCol := sheet.Usedrange.Columns.count;
  stringgrid1.RowCount:=maxRow+1;
  StringGrid1.ColCount:=maxCol+1;
  for I := 1 to MaxCol do
  begin
    for j := 1 to MaxRow do
    begin
     stringgrid1.Cells[i,j]:=excelfile.cells[j,i].value;

    end;

  end;
ExcelFile.workbooks.close;
ExcelFile.quit;
ExcelFile:=Unassigned;
end;

procedure TForm3.Button2Click(Sender: TObject);
var f: TextFile;
    i: Integer;
begin
  AssignFile(f,'d:\1.txt');
  Rewrite(f);
  with StringGrid1 do
  begin
    for i := 1 to RowCount - 1 do
    begin
        Write(F, '*'+Cells[1, i]);
         Write(F, format('%s',cells[2, i]));
          Write(F, Cells[3, i]);
           Write(F, Cells[4, i]);
            Write(F, Cells[5, i]);
           writeln(f);

    end;
  end;
  CloseFile(F);
end;

procedure TForm3.OpenExcelFile;
begin
   ExcelFile := CreateOleObject('Excel.Application');
   ExcelFile.visible:=0;
   ExcelFile.Workbooks.Open('C:\Users\HAT\Desktop\book1.xls');
   sheet := ExcelFile.WorkSheets[1];
end;
end.
الرد
#8
وعليك السلام

سأعطيك مثال لوضع الاصفار

مثال رقم الحساب : 11111  طوله خمس حروف و رقم الحساب كامل طوله 20 ، ننقص طول  المفتاح بقي 18 حرف كيفية ملأ الاصفار متبقية


كود :
edit1.Text := StringOfChar('0',18-length('11111')) + '11111'

استعملنا   StringOfChar('0',18) معنها كرر الصفر 18 مرة ، كما يمكنك استعمالها في تكرار الفراغ StringOfChar(' ',18)
الرد
#9
(18-05-2020, 07:49 PM)larbiparadox كتب : وعليك السلام

سأعطيك مثال لوضع الاصفار

مثال رقم الحساب : 11111  طوله خمس حروف و رقم الحساب كامل طوله 20 ، ننقص طول  المفتاح بقي 18 حرف كيفية ملأ الاصفار متبقية


كود :
edit1.Text := StringOfChar('0',18-length('11111')) + '11111'

استعملنا   StringOfChar('0',18) معنها كرر الصفر 18 مرة ، كما يمكنك استعمالها في تكرار الفراغ StringOfChar(' ',18)

بارك الله فيك وجزاك الله خير

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

كود :
  Cells[4, i],' ':27- length(Cells[4, i]),1);

وهذا الكود الأخير
هل من أي إنتقادات أو الكود يعتبر جيد وأصبحت خبير   Big Grin
كود :
  AssignFile(f,'d:\1.txt');
  Rewrite(f);
  with StringGrid1 do
  begin
    for i := 1 to RowCount - 1 do
    begin
    Write(F,'*00799999',stringofchar('0',10- length(Cells[2, i]))+Cells[2, i],cells[3, i],stringofchar('0',10- length(Cells[5, i]))+Cells[5, i],Cells[4, i],' ':27- length(Cells[4, i]),1);
    writeln(f);
    end;
  end;
  CloseFile(F);


مع العلم سأحاول وضع شكل العرض للمبلغ لا أدري إن كان سيؤثر أم لا أي ستضتف الفواصل أقصد Format('0,0##.##',stringGrid.Cells[i,j])
في خانة المبلغ لل StringGrid إن كان هناك تأثير سأظطر إلى دالة تحذف الفواصل

بالفعل وقعت في مشكلة حذف الفواصل من المبلغ  Sad
الرد
#10
السلام عليكم ورحمة الله تعالى وبركاته
كيف يمكنني ان استدعي هذا الملف الى قاعدة بيانات بدلا من المكون stringrid
لدي قاعدة بيانات تحتوي على نفس الحقول اي COMPTEو CLE و NOM_PRENOM وMONTANT
مع استعمال المكون TTable و DBGrid
جزاكم الله عنا كل خير
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف