Clé composée et doublons

Le
Lt_PyL
Salut à tous!

Voilà, j'ai un fichier structuré à peu près comme suit:

numcmd | codart | commentaire | contrôle

numcmd est numérique et clé avec doublon
Codart est chaîne et clé avec doublon
commentaire n'a aucun interêt
contrôle est une clé UNIQUE composée: numcmd+codart

en clair, je peux avoir des doublons de numcmd, des doublons de codart,
mais pas des doublons des deux à la fois!

Dans une fenêtre de saisie, sur un bouton de validation, j'ai le code
suivant:

//debut code
EcranVersFichier()
Ligne_cmd.num_cmd=gxNumcmd

//en cas de double doublon on modifie l'enregistrement, sinon on se
contente d'ajouter

SI
HLitRecherche(Ligne_cmd,contrôle,[gxNumcmd,SAI_Codeart..Valeur],hIdentique)<>Faux

ALORS
HModifie(Ligne_cmd)
SINON
HAjoute(Ligne_cmd)
FIN
//fin code


Tout ça fonctionne parfaitement, sauf dans le cas du hajoute
Je me retrouve avec une erreur de doublon sur ma rubrique numcmd!

Logiquement ça ne devrait pas être possible, puisque la rubrique numcmd
est une clé avec doublons!

quelqu'un aurait-il une idée?
J'ai l'impression d'avoir manqué un concept, mais j'ai beau creuser les
docs, le web et mes méninges, je ne trouve rien qui puisse m'aider

PyL
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Lt_PyL
Le #14656991
Problème résolu!

Contrairement aux autres langages dont j'avais l'habitude, les clés
composées uniques renvoient une erreur de doublon si UN des éléments est
susceptible de créer un doublon sur l'ensemble des clés composées

exemple:

aaaaaaa,1234
aaaaaaa,4321
bbbbbbb,1234 =>>>>>>>> erreur doublon
ccccccc,5678
aaaaaaa,5678 =>>>>>>>> erreur doublon aussi

vicieux, comme piège!
Avis à ceux qui ne sont pas encore tombé dedans!
patrice
Le #14656981
"Lt_PyL" news:eted03$g1j$
EcranVersFichier()
Ligne_cmd.num_cmd=gxNumcmd

//en cas de double doublon on modifie l'enregistrement, sinon on se
contente d'ajouter

SI



HLitRecherche(Ligne_cmd,contrôle,[gxNumcmd,SAI_Codeart..Valeur],hIdentique)<
Faux




les clés composé de windev marche bien comme les autres
la seule nuance est dans la gestion des composants nulls.. mais c'est pas le
probleme
faut pas faire hlitrecherche apres écranversfichier, ca va te mettre
n'importe quoi dans la fiche, donc ton hajoute ajoute une fiche existante,
mais pas celle que tu crois :)
fais ta recherche avant le ecranversfichier

trouve=vrai
si pas recherche() alors
hraz()
trouveúux
fin
ecranversfichier()
si trouve alors hmodifie() sinon hajoute()
J-M des Grottes
Le #14656961
Lt_PyL a écrit :
Problème résolu!

Contrairement aux autres langages dont j'avais l'habitude, les clés composées
uniques renvoient une erreur de doublon si UN des éléments est susceptible de
créer un doublon sur l'ensemble des clés composées

exemple:

aaaaaaa,1234
aaaaaaa,4321
bbbbbbb,1234 =>>>>>>>> erreur doublon
ccccccc,5678
aaaaaaa,5678 =>>>>>>>> erreur doublon aussi

vicieux, comme piège!
Avis à ceux qui ne sont pas encore tombé dedans!



Tu as peut-être intérêt à créer un ID unique automatique ?

A+

--
Dr J-M des Grottes
Gestionnaire du Registre des Néphrologues Francophones de Belgique
mat
Le #14656951
Lt_PyL wrote:
//debut code
EcranVersFichier()
Ligne_cmd.num_cmd=gxNumcmd

//en cas de double doublon on modifie l'enregistrement, sinon on se
contente d'ajouter

SI
HLitRecherche(Ligne_cmd,contrôle,[gxNumcmd,SAI_Codeart..Valeur],hIdentique)<>Faux

ALORS
HModifie(Ligne_cmd)
SINON
HAjoute(Ligne_cmd)
FIN
//fin code





Bonsoir,

Il faut d'abord comprendre les clés composées HF: ce n'est pas une
rubrique physique mais logique c=a+b. Puisque c est une clé unique, le
moment qu'on compose deux clés ayant la même valeur dans a ou b, suivant
l'ordre de renseignement, on a une situation de doublon. Tu ne dis pas
ce qui te fais trouver des doublons, mais ce qui ne marche de toute
façon pas, c'est d'utiliser le code article comme partie d'une clé
unique, renseigné comme premier car n'importe qui dans le réseau voulant
créer au même temps une ligne de commande pour le même article risque
alors un doublon. Par contre si tu travaille seule sur ta commande et tu
renseigne ton numéro de commande et l'article, ça doit marcher.
Normalement on utilise plutôt un numéro de ligne ou un IDAuto c'est plus
souple. Le suivant n'est qu'une solution pour ce que tu veux faire.

Salutations
Mat

Procédure OK()
//gestion de doublons manuel
//Une liaison vers Ligne_cmd.num_cmd doit se trouver dans la fenêtre
pour que le code fonctionne
bNouv est booléen
si pas
hLitRecherchePremier(Ligne_cmd,contrôle,[gxNumcmd,SAI_Codeart..Valeur])
alors
hRaz(Ligne_cmd)
EcranVersFicher()
si hAjoute(Ligne_Cmd) alors renvoyer vrai
sinon
EcranVersFicher()
si hModifie(Ligne_Cmd) alors renvoyer vrai
fin
erreur(hErreurInfo)
renvoyer faux
Publicité
Poster une réponse
Anonyme