cs_eli42
Messages postés139Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention 8 juillet 2022
-
27 juil. 2008 à 15:20
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 2021
-
5 août 2008 à 19:20
Bonjour, depuis un moment je me tate pour remplacer mes base access 2003, par Interbase, donc pour l'instant je fais quelque ligne de code pour pouvoir comparer, mais j'ai un sousi avec
je suis bloqué sur les LIKE en fait si je teste ('Select * from CLIENT where NOM like ''%' + Edit1.Text + '%'''); depuis le constructeur SQL ca marche il me trie bien les enregistrements, par contre en mode Transaction rien ne se passe pas de trie, avez une petite idée ou une solution pour rechercher au milieu d'une chaine.
Amicalement.
* Je bose sur Firebird Guardian 2, EMS 2005 et compo pour Delphi FIBplus.
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 28 juil. 2008 à 11:55
Bonjour,
ton souci ne vient pas apparemment du mode transactionnel..
une transaction ne peut pas bloquer un select sauf si une erreur se produit
et dans ce cas c'est le rollback qui intervient et qui annule TOUT.
Donc, il doit y avoir une erreur dans ton code quelque part.
mais sans le voir, c'est difficile..
cs_eli42
Messages postés139Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention 8 juillet 2022 28 juil. 2008 à 17:10
Salut Cantador, effectivement si donne rien la charette vas pas avancer voici le code :
//==============================================================================
// Routine pour eviter a chaque fois de retaper le meme code
//==============================================================================
function TFonc_Client.Insertion_ou_MAJ(instruction: string): BOOLEAN;
begin
with DM do
begin
try
IBSQL_mvt.Close; // Refermer au cas ou quelle soit ouverte
IBSQL_mvt.SQL.Clear;
//recuperation du SQL a executer
IBSQL_mvt.SQL.Add(instruction);
try
IBSQL_mvt.ExecQuery;
if not IBSQL_mvt.Prepared then IBSQL_mvt.Prepare;
//Valider modif
IBSQL_mvt.transaction.CommitRetaining;
result := True;
except
if IBSQL_mvt.transaction.InTransaction then
begin
// Annulé Modif
IBSQL_mvt.transaction.Rollback;
result := False;
end;
end;
finally
IBSQL_mvt.Close;
end;
end;
end;
//==============================================================================
Appel et mise a jour depuis le Keypress de l'Edit EC1.Text
Fonc_Client.Insertion_ou_MAJ('Select * from CLIENT where FICHE like ''%' + EC1.Text + '%''');
Voili, ca marche bien pour Suppression, Modification et Insertion, par contre contre pour le like, rien meme pas une erreur.
Si tu vois la boulette, il y a forcément une, mais je vois pas, j'avou j'ai attaqué Firebird depuis 48h
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202114 28 juil. 2008 à 19:04
il te manque une instruction :
with DM do
begin
try
IBSQL_mvt.transaction.StartTransaction;
IBSQL_mvt.Close; // Refermer au cas ou quelle soit ouverte
IBSQL_mvt.SQL.Clear;
//recuperation du SQL a executer
.....
.....
cantador
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_eli42
Messages postés139Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention 8 juillet 2022 5 août 2008 à 04:23
Suite à des insonmie je me suis mis dedans illico, malgre le rajout IBSQL_mvt.transaction.StartTransaction;
dans ma function function TFonc_Client.Insertion_ou_MAJ(instruction: string): BOOLEAN;
Alors pour l'instant je contourne le probleme j'ai ecris une fonction que pour la recherche multicritere :
function TFonc_Client.Recherche_Multi(instruction: string): BOOLEAN;
begin
with FICHE, DM do
begin
try
Client.Active := False;
Client.SQLs.SelectSQL.Clear;
Client.SQLs.SelectSQL.Add(Instruction);
Client.Active := True;
except
Exit;
end;
end;
end;
//==============================================================================
//==============================================================================
// Convertion signe * en Pourcent//function o_StrRemChar(const _str: string; _char: Char; _case: Boolean False): string;
var
x: Integer;
f_s: string;
f_c: string;
begin
Result := '';
f_s := _str;
f_c := _char;
if _case then
begin
f_s := Ansiuppercase(f_s);
f_c := Ansiuppercase(f_c);
end;
for x := 1 to Length(_str) do
if f_s[x] <> f_c then
Result := Result + _str[x] else
Result := Result + '%';
end;
//==============================================================================
// et dans mes champ Edit je recherche directement sur le FIBDataset sans passer par le FIBTransaction
//==============================================================================
// Convertion signe * en Pourcent
//==============================================================================
Procedure TFICHE.EC1KeyPress(Sender: TObject; var Key: Char);
var C1, C2, C3, C4: string;
begin
if Key = #13 then
begin
C1 := o_StrRemChar(EC1.Text, '*');
C2 := o_StrRemChar(EC2.Text, '*');
C3 := o_StrRemChar(EC3.Text, '*');
C4 := o_StrRemChar(EC4.Text, '*');
Fonc_Client.Insertion_ou_MAJ('Select * From CLIENT where (FICHE LIKE ''%'
+ C1 + '%'') And (CP LIKE ''%'
+ C2 + '%'') And (VILLE LIKE ''%'
+ C3 + '%'') And (TELEPHONE LIKE ''%'
+ C4 + '%'') Order by FICHE ASC ');
if DM.CLIENTNFiche.Text = '' then
begin
Fonc_Client.Recherche_Multi('Select * From CLIENT Order By FICHE ASC');
end else
begin
DBGCLIENT.SetFocus;
end;
Key := #0;
end;
end;
//==============================================================================
Voila avec ca j'ai bien mes trie sur 4 champs, donc ma question quel est l'interet de la Tansaction?
Beau Temps Belle Mer
cs_eli42
Messages postés139Date d'inscriptionmardi 24 décembre 2002StatutMembreDernière intervention 8 juillet 2022 5 août 2008 à 17:38
Merci Cantador, ta reponse m'aiguille un peu plus, je pense que je suis dans la bonne voie, mais tout de même sauter de Paradox, Access vers du Firebird il y a tout de même pas mal de boulot, mais cette faisabilité est possible avec un peu de boulot.
@Plus