Recherche Like avec Firebird et transaction [Résolu]

cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 27 juil. 2008 à 15:20 - Dernière réponse : cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention
- 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.

Beau Temps belle Mer
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 5 août 2008 à 17:27
3
Merci
désolé eli42, mais j'ai une tonne de boulot qui m'est tombée dessus..
mais je te répond :

Avec firebird, si tu choisis le mode transctionnel
(autocommit à false + un Mode d'isolation)
toutes tes opérations même un simple select (lecture seule) se feront en mode transactionnel (transactions internes au système)
Mais, bien sûr, si tu fais une opération en lecture seule, il est inutile de construire une transaction spécifique, puisque RIEN ne sera écrit dans la base.
Ce n'est que lorsque tu exécutes une opération d'écriture (insert ou update) qu'il est nécessaire de lancer une transaction afin de pouvoir tout annuler en cas d'erreur. (c'est le //Valider modif qui m'a géné..)

C'est une sécurité afin d'assurer l'intégrité de tes informations.

cantador

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_cantador
Meilleure réponse
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 5 août 2008 à 19:20
3
Merci
Je te conseille également avec firebird de choisir des bons composants DataAware.(IBO, FIB+ ou d'autres il y en a des nvx qui sont sortis)

Le seul ennui est qu'ils sont payants, mais bcp plus performants et plus conviviaux que les composants IBX natifs qui commencent à dater un peu..

cantador

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_cantador
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 28 juil. 2008 à 11:55
0
Merci
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..

cantador
Commenter la réponse de cs_cantador
cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 28 juil. 2008 à 17:10
0
Merci
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

A plus
Commenter la réponse de cs_eli42
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 28 juil. 2008 à 19:04
0
Merci
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
Commenter la réponse de cs_cantador
cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 4 août 2008 à 20:57
0
Merci
Désolé réponse tardive, je te remerci Cantador, je vais pouvoir cette semaine contunuer à decortiquer Firebird.
Commenter la réponse de cs_eli42
cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 5 août 2008 à 04:23
0
Merci
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 :

//==============================================================================
// 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
Commenter la réponse de cs_eli42
cs_eli42 116 Messages postés mardi 24 décembre 2002Date d'inscription 30 juillet 2018 Dernière intervention - 5 août 2008 à 17:38
0
Merci
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

Beau Temps Belle Mer
Commenter la réponse de cs_eli42

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.