begin process at 2010 02 10 09:16:43
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Algorithme

 > 

Autre

 > 

Pb objet Eaccess violation 004B8620


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pb objet Eaccess violation 004B8620

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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ée 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


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales