Problème de Locate et AppendRecord avec Delphi 2006 [Résolu]

dguehenn 4 Messages postés mardi 3 octobre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 19 oct. 2006 à 17:55 - Dernière réponse : dataconcept 6 Messages postés mercredi 27 avril 2011Date d'inscription 27 avril 2009 Dernière intervention
- 6 nov. 2007 à 04:21
Bonjour,


Lors du passage de mon application de Delphi 7 à Delphi 2006, deux problèmes
sont apparus :


Lorsque j'utilise la méthode LOCATE, j'ai des résultats différents entre les
deux versions.


Mon code :


 with TABLE do

 Begin

    if not Locate('SESSION_ID;UTI_ID', VarArrayOf(['100', '1']),
[]) then

    begin

        ...

       

AppendRecord(['100','1']);

        ...

    end

    else

       ...

end;




Ma table "TABLE" contient une ligne avec SESSION_ID=100 et UTI_ID=1 (
les champs sont du type NUMBER )

1er Problème


Sous Delphi 7, LOCATE trouve cette ligne et je passe dans le else.

Sous Delphi 2006, LOCATE ne la trouve pas et j'essaye alors de l'enregistrer à
nouveau


Si je modifie le code pour ne rechercher que SESSION_ID qui est l'index de ma
table, LOCATE retour TRUE

if not Locate('SESSION_ID', VarArrayOf(['100']), []) then


Mais si je modifie le code pour ne rechercher que USER_ID qui n'est pas l'index
de mon tableau, LOCATE retour FALSE

if not Locate('USER_ID', VarArrayOf(['1']), []) then

2eme Problème

Lorsque j'utilise AppendRecord sous Delphi 2006, j'ai un message d'erreur :

Erreur SQL générale

[oracle][odbc][ora]ORA-01722: Nombre non valide
Afficher la suite 

6 réponses

Répondre au sujet
dguehenn 4 Messages postés mardi 3 octobre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 15 nov. 2006 à 09:29
+3
Utile
Pour résoudre le problème lié au Locate et AppendRecord dans ce cadre là, il faut mettre à jour la version du driver ODBC d'Oracle en version 9.2.0.7.0
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de dguehenn
cs_pers 40 Messages postés vendredi 2 mai 2003Date d'inscription 9 décembre 2009 Dernière intervention - 21 oct. 2006 à 11:11
0
Utile
Bonjour

En ce qui me concerne je préfère quand même exécuter un sql plutôt que d'utliser le locate... mais bon ca ne resoud peut-être pas ton problème ...

A propos je vois que tu as migré de D7 vers D2006 : tu n'as pas rencontré trop de problèmes et tu a acheté la nouvelle version ou upgradé delphi 7 ??

merci d'avance
Commenter la réponse de cs_pers
dguehenn 4 Messages postés mardi 3 octobre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 23 oct. 2006 à 09:22
0
Utile
Bonjour,


L'ensemble de mon application utilise la méthode du Locate, je prendrai
beaucoup trop de temps à modifier mon code pour exécuter une requête à la
place.


Pour la migration de mon application de Delphi 7 vers Delphi 2006, j'ai fait un
upgrade, mais j'ai rencontré deux problèmes lors de cette migration : Le
problème de Locate et le problème de quickreport.


Personne n'a eu ce même problème de Locate?


Merci de votre réponse.
Commenter la réponse de dguehenn
dguehenn 4 Messages postés mardi 3 octobre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 27 oct. 2006 à 15:47
0
Utile
J'ai trouvé l'origine de ce problème de locate et de AppendRecord :

Sous Oracle, les champs qui sont de type NUMBER avec une taille définie provoque ce problème

Lors de l'insertion, j'ai alors le message :

Erreur SQL générale
[oracle][odbc][ora]ORA-01722: Nombre non valide

et le locate ne fonctionne plus.

Exemple :

Ma table Oracle

colonne              type de données    taille     echelle
SESSION_ID      NUMBER           
USER_ID             NUMBER            4            0

Si je recherche une ligne avec SESSION_ID, le locate fonctionne mais si je recherche une ligne avec USER_ID, impossible de la trouver.

Avez-vous le même résultat que moi?
Commenter la réponse de dguehenn
dataconcept 6 Messages postés mercredi 27 avril 2011Date d'inscription 27 avril 2009 Dernière intervention - 6 nov. 2007 à 04:21
0
Utile
Bonjour,

Il y a un BUG dans la fonction locate. ce bug provoque une lenteur croissante lors de recherche sur des tables uniquement lorsque ces tables sont partagées en réseau par plus d'un utilisateur.

A partir de DELPHI 5, le BDE à subit sa dernière évolution, on lisait dans la doc qu'i était conseillé d'abandonner la fonction GotoKey au profit de locate pour effectuer des recherches dans une table.
Depuis j'ai utiliser locate pour toutes mes applications.

Voici mes constatations :

Dans toutes mes applications BDE j'utilise le format DBase(level7), sont avantage très robuste et facile à maintenir

Locate fonctionne très bien lorsque vous effectuez des recherches en local ou sur une table distante dans un dossier partagé

Lorsqu'il y a plus d'un utilisateur  effectuant une recherche sur la même table, un ralentissement de la recherche se produit, ce ralentissement va croissant jusqu'à l'impossibilité d'utiliser l'application.
 
Ce phénomène se produit sur les tables au format dbf (pas tester sur Paradox) il est possible qu'il se produise également sur d'autre format de fichier.

1- Plus la taille de la table est importante et plus le ralentissement devient conséquent.
2- Lorsque vous effectuer des recherches sur plusieurs grosses tables ca devient catastrophique
3- Cela uniquement lorsque plusieurs utilisateurs effectue des recherches sur ces tables en réseau, avec un utilisateur pas de problème.

J'avais constaté ces phénomène de ralentissement, mais je pensais que c'était un problème hardware puis finalement je pensais que le BDE n'étais pas adapté aux grosses base en réseau.

Lorsque j'ai rencontré un client qui utilise un encore un de mes logiciel développer en delphi 3, sur des très grosses  tables en réseau, celui-ci me dit qu'il ne constate aucun ralentissement, ceci à été le déclic qui à fait que j'ai trouver la cause.

1- Mon application delphi3 avait été recompilé en delphi5 puis 7 : donc ce ne provenait pas de la version de delphi ni du bde, après avoir analyser mon code, j'ai constater que depuis j'utilisais Locate à la place de GotoKey pour mes recherches, après avoir mis des points de suivis avant et apres une fonction locate sur une application réseau, j'ai constater le phénome de ralentissement uniquement lorsque la base était partagée avec d'autres

Après avoir remplacé mes locate par des gotokey, les ralentissements disparaissais.

Ceci est bien la preuve du BUG de la fonction Locate. et comme le BDE n'est plus maintenu, pas de correction disponible...

Après avoir remplacer tous les Locate  :
1- recherche sur un champ unique indexé  par des Gotokey
2- recherche multi champ par un filtre sur la table ou une portée SetRangestart

mon logiciel tourne nikel...

Conseil : ne pas remplacer des locate par un Sql car la réponse est plus lente que Gotokey ou une portée, sql est très rapide sur unn ensemble de résultat mais pas sur un résultat comportant que un enregistrement.

Voilà, depuis lors, j'utilise toujours BDE et des tables Dbase sur des applications réseau avec +- 10 users et des tables de plus ou moin 100000 records (tailles de mes tables 5 à 10 megas) sans soucis de rapidité.

Vive le BDE, les SGBD j'y passe pas encore....

bobo
Commenter la réponse de dataconcept
dataconcept 6 Messages postés mercredi 27 avril 2011Date d'inscription 27 avril 2009 Dernière intervention - 6 nov. 2007 à 04:21
0
Utile
Bonjour,

Il y a un BUG dans la fonction locate. ce bug provoque une lenteur croissante lors de recherche sur des tables uniquement lorsque ces tables sont partagées en réseau par plus d'un utilisateur.

A partir de DELPHI 5, le BDE à subit sa dernière évolution, on lisait dans la doc qu'i était conseillé d'abandonner la fonction GotoKey au profit de locate pour effectuer des recherches dans une table.
Depuis j'ai utiliser locate pour toutes mes applications.

Voici mes constatations :

Dans toutes mes applications BDE j'utilise le format DBase(level7), sont avantage très robuste et facile à maintenir

Locate fonctionne très bien lorsque vous effectuez des recherches en local ou sur une table distante dans un dossier partagé

Lorsqu'il y a plus d'un utilisateur  effectuant une recherche sur la même table, un ralentissement de la recherche se produit, ce ralentissement va croissant jusqu'à l'impossibilité d'utiliser l'application.
 
Ce phénomène se produit sur les tables au format dbf (pas tester sur Paradox) il est possible qu'il se produise également sur d'autre format de fichier.

1- Plus la taille de la table est importante et plus le ralentissement devient conséquent.
2- Lorsque vous effectuer des recherches sur plusieurs grosses tables ca devient catastrophique
3- Cela uniquement lorsque plusieurs utilisateurs effectue des recherches sur ces tables en réseau, avec un utilisateur pas de problème.

J'avais constaté ces phénomène de ralentissement, mais je pensais que c'était un problème hardware puis finalement je pensais que le BDE n'étais pas adapté aux grosses base en réseau.

Lorsque j'ai rencontré un client qui utilise un encore un de mes logiciel développer en delphi 3, sur des très grosses  tables en réseau, celui-ci me dit qu'il ne constate aucun ralentissement, ceci à été le déclic qui à fait que j'ai trouver la cause.

1- Mon application delphi3 avait été recompilé en delphi5 puis 7 : donc ce ne provenait pas de la version de delphi ni du bde, après avoir analyser mon code, j'ai constater que depuis j'utilisais Locate à la place de GotoKey pour mes recherches, après avoir mis des points de suivis avant et apres une fonction locate sur une application réseau, j'ai constater le phénome de ralentissement uniquement lorsque la base était partagée avec d'autres

Après avoir remplacé mes locate par des gotokey, les ralentissements disparaissais.

Ceci est bien la preuve du BUG de la fonction Locate. et comme le BDE n'est plus maintenu, pas de correction disponible...

Après avoir remplacer tous les Locate  :
1- recherche sur un champ unique indexé  par des Gotokey
2- recherche multi champ par un filtre sur la table ou une portée SetRangestart

mon logiciel tourne nikel...

Conseil : ne pas remplacer des locate par un Sql car la réponse est plus lente que Gotokey ou une portée, sql est très rapide sur unn ensemble de résultat mais pas sur un résultat comportant que un enregistrement.

Voilà, depuis lors, j'utilise toujours BDE et des tables Dbase sur des applications réseau avec +- 10 users et des tables de plus ou moin 100000 records (tailles de mes tables 5 à 10 megas) sans soucis de rapidité.

Vive le BDE, les SGBD j'y passe pas encore....

bobo
Commenter la réponse de dataconcept

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.