مشكل مع auto incrémentation
#1
السلام عليكم ورحمة الله وبركاته

عندي جدول به حقل ID ذا TYPE + يعني auto incrémentaion يعمل جيد في dbgrid لكن عندما احذف كل التسجيلات اي تصبح table فارغة واعيد التسجيل من جديد، حقل ID يكمل من آخر تسجيل لا من جديد يعني من 1
ما الحل

ثانيا
هل فيه مشكل اذا استعملت هذا الكود عند التسجيل

كود :
table1.edit; table1.Post; table1.FlushBuffers;

ثالثا
مامعني Compactage de tables Paradox وماهو دوره؟؟؟

شكرا
الرد
#2
إقتباس :مامعني Compactage de tables Paradox وماهو دوره؟؟؟

أخي الحبيب عندما تقوم بحذف السجلات داخل قاعدة البيانات ، فإنها لا تحذف فزيائيا ،
أي أنها تحذف (Logiquement) ، وعندما تقوم بعملية ال Compactage ، فهه الأخيرة تقوم بالحذف الفزيائي.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد
#3
Unprogramme كتب :أخي الحبيب عندما تقوم بحذف السجلات داخل قاعدة البيانات ، فإنها لا تحذف فزيائيا ،
أي أنها تحذف (Logiquement) ، وعندما تقوم بعملية ال Compactage ، فهه الأخيرة تقوم بالحذف الفزيائي.

ممكن كيفية عمل compactage

شكرا
الرد
#4
وعليكم السلام ورحمة الله وبركاته
إقتباس :يكمل من آخر تسجيل لا من جديد يعني من 1 ما الحل
PHP كود :
function ResetAutoInc(FileName: TFileName; NewValue:Longint): Boolean;
begin
  with TFileStream
.Create(FileName, fmOpenReadWrite) do
  try
    
Result := (Seek($49, soFromBeginning) = $49) and (Write(NewValue, 4) = 4);
  finally
    
Free;
  
end;
end; 
الاستخدام:
PHP كود :
if ResetAutoInc('C:\Database\MaTable.DB',0) then 
إقتباس :مامعني Compactage de tables Paradox وماهو دوره؟؟؟
قاعدة البيانات لا تحتوي فقط على البيانات...
بالتوفيق.
الرد
#5
kachwahed كتب :قاعدة البيانات لا تحتوي فقط على البيانات...

بارك الله فيك أخي الفاضل
انا جد مبتدأ
ممكن شرح بسيط للكود
وفي اي مكان اضعه ^_^

في حال اسعمال هذا الكود في الحذف هل يفي بالغرض
كود :
table1.delete;
او يجب اضافة كود اخر للحذف التسجيل فيزيائيا

شكرا
الرد
#6
حاول أخذ ما تحتاج من هذا الكود :

table Paradox (v.7)

PHP كود :
function PackTable(aNomDeLaTable : String; aReindexer : Boolean) : Boolean;
var
   
Tbl     : TTable;
   
cProps  : CURProps;
   
hDb     : hDBIDb;
   
TblDesc : CRTblDesc;
begin
     Result 
:= False;
     
Tbl := TTable.Create(nil);
     try
        
with Tbl do
        
begin
             Active 
:= False;
             
// Le chemin d'accès de la table
             
DatabaseName := ExtractFilePath(aNomDeLaTable);
             
// Le nom de la table paradox
             
TableName := ExtractFileName(aNomDeLaTable);
             
// Ouverture en mode exclusif
             
Exclusive := True;
             
Open;
        
end;
        
// Le chemin courant est utilisé de façon temporaire pour le pack
        
SetCurrentDir(ExtractFilePath(aNomDeLaTable));
        
// Il faut être sûr que la table soit ouverte (et de manière exclusive)
        
if not tbl.Active then
        begin
             
// La fonction renverra false
             // raise EDatabaseError.Create('La table doit être ouverte pour la compacter');
             
Exit;
        
end;
        if 
not tbl.Exclusive then
        begin
             
// La fonction renverra false
             // raise EDatabaseError.Create('La table doit être ouverte de manière exclusive pour la compacter');
             
Exit;
        
end;
        
// Recherche les propriétés de la table pour déterminer son type
        // Check(DbiGetCursorProps(tbl.Handle, cProps));
        
if DbiGetCursorProps(tbl.Handle, cProps) <> DBIERR_NONE then
        begin
             
// La fonction renverra false
             
Exit;
        
end;
        
// Si la table est une table Paradox, on la compacte
        
if (cProps.szTableType = szPARADOX) then
        begin
             
// Préparation d'une structure vide...
             
FillChar(TblDesc, SizeOf(TblDesc), 0);
             
// Obtient le handle de la table
             // Check(DbiGetObjFromObj(hDBIObj(tbl.Handle), objDATABASE, hDBIObj(hDb)));
             
if (DbiGetObjFromObj(hDBIObj(tbl.Handle), objDATABASE, hDBIObj(hDb)) <> DBIERR_NONE) then
             begin
                  
// La fonction renverra false
                  
Exit;
             
end;
             
// On remplit le nom de la table dans la description de table...
             
StrPCopy(TblDesc.szTblName, tbl.TableName);
             
// On remplit le type de la table dans la description de table...
             
StrPCopy(TblDesc.szTblType, cProps.szTableType);
             
// Coche l'option de compactage dans la description de table...
             
TblDesc.bPack := True;
             
// Ferme la table pour que la restructuration soit effective...
             
Tbl.Close;
             
// Appel de DbiDoRestructure qui effectue le compactage demandé...
             // Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, aReindexer));
             
Result := (DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, aReindexer) = DBIERR_NONE);
        
end
        
else
            
// Compactage de table Paradox uniquement
            
Result := False; // raise EDatabaseError.Create('Compactage de table paradox uniquement !');
 
     
finally
            if 
Tbl.Active then
               Tbl
.Close;
            
Tbl.Free;
     
end;
end; 
الرد
#7
بارك الله فيك أخي الفاضل
والله انا مبتدا
ممكن شرح طريقة عمل الكود وكيفية وضعه
شكرا
الرد
#8
إقتباس :يكمل من آخر تسجيل لا من جديد يعني من 1
الحقول المتزايدة تلقائيا صنعت بهذا الشكل عمدا
لا ينبغي أن يتم إعادة الرقم التسلسلي إلى 1
وإن كان ذلك ممكن من خلال طرق ملتوية كما سبق (والتي قد تتسبب أحيانا أعراض جانبية!)

حاول أن تتعامل مع الأمور كما هي، لا تعقد الأمور على نفسك Smile من صنعها بهذا الشكل يدري جيدا لماذا...
دع الرقم يتصاعد... وعند إنهائك للمشروع قدم للزبون نسخة جديدة من قاعدة البيانات، ليبدأ العد من البداية

أو بطريقة أفضل استخدم رقم تعريفي من إنشائك وتحكم به كما شئت من خلال الأحداث OnBeforePost و OnBeforeInsert أو غيرها... انظر:
http://www.delphi4arab.net/forum/showthr...p?tid=1515
بالتوفيق.
الرد
#9
بارك الله فيك أخي
عندي سؤال آخر
انا استعمل هذا الكود حين اضيف تسجيل جديد
كود :
table1.append; table1.fieldbyname('champ').value:=edit1.text; table1.edit; table1.post; table1.FlushBuffers;

هل هي صحيحة حيث احبذ اضافة تسجيل فيزيائي

وماهذه الاكواد الصحيح لحذف هذه التسجيلات فيزيائيا

انا استعمل هذا الكود لحذت تسجيل واحد
كود :
table1.delete;

وحين احبذ تفريغ كل التايبل استعمل هذا الكود
كود :
While not (table3.eof) do Table3.delete ;

شكرا
الرد
#10
يكفي الآتي:
PHP كود :
    Table1.Append;
    
//Table1.Edit;//<-- Edit قبل التعديل
    
Table1.FieldByName('champ').Value := Edit1.Text;    
    
Table1.Post; 
Edit لجعل الجدول في وضع التعديل... ثم بعده التعديل
في هذه الحال Append تنوب عن Edit
انسى أمر "الفيزيائي"...
لحذف الكل:
http://www.delphi4arab.net/forum/showthr...p?tid=4705
لا تنسى البحث...
بالتوفيق.
الرد


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


يقوم بقرائة الموضوع: بالاضافة الى ( 2 ) ضيف كريم