|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Pb objet Eaccess violation 004B8620 [ Algorithme / Autre ] (martChamp)
Informations & options pour cette discussion
mardi 23 janvier 2007 à 17:28:40 |
Pb objet Eaccess violation 004B8620

martChamp
|
Bonjour à tous,
Dans un programme que je devellope, j'utilise une classe objet (intervenant) qui a pour attribut un tableau d'objet (poste)
Description class intervenant
type intervenant = class ( TObject )
private
Nom : string; Prenom : string; Adresse1 : string; Adresse2 : string; Email : string; DateNaiss : string; LieuNaiss : string; Nationalite : String; NumSecu : string; NumConge : string; Tel : string; Fax : string; Portable : string; DateEmbauche : string; lesposte : Array of poste; nbposte : integer;
Plus loing dans une procedure je me sert de ma base de donnée pour initialiser mon objet intervenant
procedure intervenant.loadSQL(idinter : integer);
begin with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT * FROM intervenant WHERE idintervenant LIKE "'+ inttostr(idinter) +'"'); Active := true; end;
Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString; Nationalite := bdd.ModuleBDD.ADOQuery_traitementint.fields[11].AsString; LieuNaiss := bdd.ModuleBDD.ADOQuery_traitementint.fields[10].AsString; Adresse2 := bdd.ModuleBDD.ADOQuery_traitementint.fields[4].AsString; Tel := bdd.ModuleBDD.ADOQuery_traitementint.fields[5].AsString; Fax := bdd.ModuleBDD.ADOQuery_traitementint.fields[6].AsString; Portable := bdd.ModuleBDD.ADOQuery_traitementint.fields[7].AsString; Email := bdd.ModuleBDD.ADOQuery_traitementint.fields[8].AsString; Nom := bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString; Prenom := bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsString; DateNaiss := bdd.ModuleBDD.ADOQuery_traitementint.fields[9].AsString; NumSecu := bdd.ModuleBDD.ADOQuery_traitementint.fields[12].AsString; NumConge := bdd.ModuleBDD.ADOQuery_traitementint.fields[13].AsString; dateEmbauche := bdd.ModuleBDD.ADOQuery_traitementint.fields[14].AsString;
with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT nomposte, cnc, idintervenant FROM intervenant_poste, poste WHERE intervenant_poste.numposte = poste.numposte AND idintervenant LIKE "'+ inttostr(idInter) +'"'); Active := true; first; while not eof do begin nbposte := nbposte + 1; lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next; end; end; end;
Delphi me fait une erreur eaccess violation a la ligne mis en rouge, je ne vois pas pk, je pensse que cela vien d'un probléme de pointeur!!!
Je compte sur vous pour méclairer dautant que je suis debutant un delphi. Merci d'avance
|
|
|
mardi 23 janvier 2007 à 19:38:52 |
Re : Pb objet Eaccess violation 004B8620

jace1975
|
yo,
déjà ton code pas très clair avec tes dd.ModuleBDD.ADOQuery_traitementint bon c'est pas tres grave mais c'est chiant a lire sur 20 lignes alors 50000 je te raccontes pas
sur ton problème, je vois deux choses : - tu utilises un objet poste, mis je ne vois pas dans ton code un truc du genre poste:=tposte.create( param);
donc forcément tu essaye d'acceder à une procédure de ton objet poste qui n'a pas été défini en mémoire donc....
- array of poste , mouais pourquoi pas mais ton tableau n'est jamais défini ni dynamiquement ni à la déclaration donc ca risque de coincer aussi ici ( perso y'a longtemps que j'ai abandonné les array pour gérer des object -> tobjectlist )
tschusssss
|
|
|
mardi 23 janvier 2007 à 19:55:36 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
il faut que tu fasse un SetLength(lesposte, TAILLE) pour allouer des emplacements memoire à ton tableau dynamique. NB: les indices de ton tableau commencent à 0. NB : jette un coup d'oeil a l'aide : tableaux dynamiques => tableaux dynamiques (Reference du langage delphi)
nbPoste := 0; with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT
nomposte, cnc, idintervenant FROM intervenant_poste, poste
WHERE intervenant_poste.numposte = poste.numposte AND idintervenant
LIKE "'+ inttostr(idInter) +'"'); Active := true; first; while not eof do begin nbposte := nbposte + 1; setLength(lesposte, nbposte); lesposte[nbposte-1]
:=
poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next; end; end;
|
|
|
mardi 23 janvier 2007 à 20:00:01 |
Re : Pb objet Eaccess violation 004B8620

Delphiprog
|
Réponse acceptée !
Ton Tableau lesposte n'est pas dimensionné ! 1/ Soit tu lui attribues une taille dans le constructeur de la classe intervenant si tu la connais lors de l'instanciation d'un objet intervenant. Au passge, essaie d'utiliser la convention d'écriture utilisée par Borland en mettant un "T" devant le nom de la classe. Cela permet de distinguer entre l'instance de la classe et la classe et d'éviter les erreurs de débutants. 2/ soit tu le dimensionnes automatiquement dans le code begin nbposte := nbposte + 1; //redimensionner le tableau dynamiquement SetLength(lesposte, nbposte); lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next;3/ soit tu utilises un descendant de la classe TObject comme TList, TComponentList ou TObjectList, etc qui facilite la gestion des références et la désallocation de mémoire de manière automatique... De grâce, utilises le mot clé With pour alléger ton code et le rendre plus lisible...  Un dernier conseil : évites d'utiliser les champs par leur index retournés par une requête. Si ta base est restructurée, tout ton code est à revoir... Exemple : au lieu de Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString;Tu peux écrire : with bdd.ModuleBDD.ADOQuery_traitementint do begin Adresse1 := FieldByName('Adresse1').AsString; //...la suite end;
De cette manière le code est largement plus lisible et plus facile à maintenir. Enfin ,si je puis me permettre un dernier conseil d'optimisation, est-ce bien utile d'utiliser un prédicat comme Like (très gourmand en temps de traitement) dans tes requêtes SQL quand il ne s'agit que de comparer avec une valeur entière ? 'SELECT * FROM intervenant WHERE idintervenant LIKE "'+ inttostr(idinter) +'"'
Suggestion : 'SELECT * FROM intervenant WHERE idintervenant = '+ inttostr(idinter) +'''
Bon courage pour la suite  May Delphi be with you !
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient. 
|
|
|
mardi 23 janvier 2007 à 20:04:09 |
Re : Pb objet Eaccess violation 004B8620

Delphiprog
|
Erratum : au lieu de : lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString);
Il faut lire : lesposte[nbposte - 1] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString);Je suis tout à fait d'accord avec jayce1975 pour dire ques tableaux c'est bien et qu' il y a très longtemps que je ne les utilise plus non plus. May Delphi be with you !
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient. 
|
|
|
mardi 23 janvier 2007 à 20:07:35 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
j'ai ete si lonb que ca a repondre !!!
@jace : - je ne vois pas de variable "poste", je vois bien un intervenant.loadSQL. Et si l'objet n'existait pas, ca aurait planté sur une ligne precedente, comme Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString; par exemple - il est vrai que dans ce cas, une TObjectList serait plus appropriée
De plus je ne vois pas de fermeture de tes requetes SQL. un petit ADOQuery_traitementint.freeou un ADOQuery_traitementint.active := false; ferait pas de mal.
|
|
|
mardi 23 janvier 2007 à 20:17:29 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
je crois qu'il y a un leger souci de conception, la condition idintervenant LIKE "'+ inttostr(idinter) +'" me semble tres etrange. En effet, l'utilisation du like et des guillemets me laissent penser que c'est un champ texte, et que martChamp utilise seulement des entiers dans ce champ. Ou est donc l'interet de ne pas utiliser un champ de type entier qui sera beaucoup plus rapide pour ces traitements?!!
Une autre petite remarque (pour delphiprog notament) : je suis d'accord que l'utilisation du like dans ce cas est completement sans interet, mais je pense qu'un SGBD digne de ce nom doit etre capable de voir qu'il n'y a pas de caractere "%" dans la valeur, et donc qu'il faut simplement le remplacer par un "=" pour obtenir le meme resultat.
|
|
|
mercredi 24 janvier 2007 à 14:26:59 |
Re : Pb objet Eaccess violation 004B8620

martChamp
|
bonjour et mercie beaucoup pour votre reponsse sa marche ainssi, il et clair qu'avec un type tobjectlist se serait plus simple, je vais me pencher la dessus. Enfin mercie encor de m'avoir débloquer , longue vie a la prog 
|
|
|
Cette discussion est classé dans : fields, bdd, adoquery, modulebdd, traitementint
Répondre à ce message
Sujets en rapport avec ce message
Calculated fields [ par maga ]
Salutje galère, j'ai fait tout les forums impossiblea trouver le moyen avec une Dbgrid de faire un relevéde compte avec débit- crédit- solde mis a jou
Sql et Bdd [ par viper ]
Je cherche depuis qq temps à récupérer le resultat d'une requet SQL avec un TQuery et une base de donnée mais sans succès...J'aimerais donc savoir com
TTable: copier une table dans une autre [ par juan ]
Bonjour tous, mon problème aujourd'hui, c'est que j'ai une table Table1 qui est filtrée, j'ai créé une deuxième table Table2 sans aucun enregistrement
Lien vers des fichiers dans une bdd??? [ par pedrito83 ]
débutant confirmé ;-)Voilà, je dois programmer en Delphi2 (oui je sais on en est au 6 ) et je débute en delphi (1 semaine que je programme seulement )
Selectionner un alias de BDD à partir d'un formulaire [ par lomig ]
Bonjour, j'aimerais pouvoir a partir d'un formulaire, avoir accès à la liste des alias de BDD pour pouvoir en choisir une et l'assigner aux differents
BDD et Internet [ par JoeyAstor ]
Bon alors c pas simple ... pour moi en tout cas ...je voudrais me connecter à une base access ... jusque là pas de problème ... si ce n'est que ma bas
àexécution/pas à pas [ par usmok ]
j'ai un prog ki gere plusieurs bddkan j'exécute l'appli, mon prog plante (pendant kil é en train de trier des infos stovker sur une des bdd)alors ke k
àexécution/pas à pas [ par usmok ]
j'ai un prog ki gere plusieurs bddkan j'exécute l'appli, mon prog plante (pendant kil é en train de trier des infos stovker sur une des bdd)alors ke k
bdd définie par l'utilisateur [ par lnicos ]
Salut, j'aimerais un programme de base de données, mais je ne sais pas si je dois utiliser ado, dbexpress ou autre.J'aimerais que l'utilisateur puisse
BDD client/serveur [ par Corbatwork ]
salutquelqu'un pourrait-il m'expliquer simplement quels sont les composants à utiliser pour faire une appli BDD en serveur et les composants à utilise
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|