La commande Xbase SET CARRY est utile en ce qu'elle permet au développeur de
spécifier les champs à «porter» de la ligne actuelle à une nouvelle ligne (commande
append).
Il n'y a pas d'équivalent direct en OODML pour cela. Mais Ken Mayer a créé une routine
qui est dans la bibliothèque dUFLP de la base de connaissances. Le code est attaché à
un bouton-poussoir dans le fichier CUSTBUTT.CC, le bouton-poussoir est appelé
kmCarryPushButton. Le code est montré ci-dessous, mais il n'y a aucune garantie qu'il
fonctionne si vous le copiez-collez à partir d'ici à l'événement OnClick d'un autre
bouton (ceci est un code assez complexe). Le code ci-dessous a été mis à jour dans le
dUFLP afin d'avoir plus de fonctionnalités, donc si vous souhaitez que le code complet,
vous devriez consulter la dernière version de dUFLP.
Vous pouvez aussi consulter dans dUFLP, setcarry.prg et CopyRow.cc, toujours de Ken
Mayer.
Un résumé rapide du code ci-dessous: il y a une propriété d'un champ qui peut être
utilisée pour spécifier les champs, qui est une propriété personnalisée du bouton
poussoir. Si elle est vide, on copie tous les champs (sauf ceux en lecture seule, les
champs de verrouillage, et autres). Ceux qui sont copiés le sont dans un tableau, la
méthode beginAppend du rowset est appelée, puis les valeurs du tableau sont déposées
dans les champs appropriés du buffer de la nouvelle ligne.
function onClick |
// Y-a-il un rowset sur le formulaire ? |
rType = this.form.rowset |
if ( TYPE( "rType" ) == "U" ) |
msgbox( 'Impossible de copier le contenu des lignes, sans un rowset !',; |
"Impossible!", 16 ) |
return |
|
else |
// Si c'est le cas, vérifiez l'état ensemble de lignes |
// si nous sommes en édition / ajout d'une ligne |
// nous ne voulons pas simplement fermer le formulaire ... |
nState = this.form.rowset.state |
do case |
case nState == 2 or nState == 3 |
msgbox( "Sauvegardez en premier cette ligne", ; |
"Impossible de copier!", 16 ) |
case nState == 4 |
msgbox( "Vous êtes en mode filtre",; |
"impossible d'abandonner!", 16 ) |
otherwise |
|
// liste de champs (optionnel) |
if type( "this.Carry" ) == "C" |
lList = true |
else |
lList = false |
endif |
|
// tableau utilisé pour copier la ligne courante |
aCarry = new Array() |
// raccourci la référence form.rowset.fields : |
fFields = form.rowset.fields |
|
// copie de l'enregistrement courant |
for i = 1 to fFields.size |
lAdd = true |
/* |
sauf pour les champs readonly, autoincrement |
ou lock (_dbaseLock) |
NOTE: Les champs _dbaseLock n'ont pas de |
type ou de propriétés readOnly, |
Nous devons donc veiller à ce qu'ils |
existent avant de vérifier ce |
qu'ils contiennent ... |
*/ |
if ( type( "fFields[i].readOnly" ) #
"U" and ; |
fFields[i].readOnly ) or ; |
( type ( "fFields[i].type" ) # "U"
and ; |
"AUTOINC" $ fFields[i].type ) or ; |
fFields[i].className == "LOCKFIELD" |
lAdd = false |
endif |
|
// Champs non this.Carry si cela est prévu... |
if lList AND ; |
NOT upper( fFields[i].fieldName ) $ ; |
upper( this.Carry ) |
lAdd = false |
endif |
|
if not lAdd |
aCarry.add( "* Saute ce champ *" ) |
else |
/* |
si nous avons un lookupRowset, alors |
nous avons une déclaration lookupSQL, et |
nous devons nous assurer que nous stockons la |
valeur qui doit être stockée, PAS |
la valeur qui sera retournée par |
lookupSQL ... |
*/ |
if fFields[i].lookupRowset # NULL |
aCarry.add(
fFields[i].lookupRowset.fields[2].value ) |
else |
aCarry.add( fFields[i].value ) |
endif |
endif // form.rowset.fields ... |
next |
|
// ajoute une nouvelle ligne |
form.rowset.beginAppend() |
|
// ------------------------------- |
// copie les données de la ligne précédente : |
for i = 1 to fFields.size |
if aCarry[i] == "* Skip This Field *" |
loop |
else |
fFields[i].value := aCarry[i] |
endif // skip ... |
next |
|
// réaffiche |
form.rowset.refreshControls() |
|
// informe l'utilisateur : |
msgbox( "Enregistrement copié -- vous êtes en mode ajout"+; |
" faites les modifs et sauvegardez ou abandonnez cette nouvelle
ligne.",; |
"Copie terminée", 64 ) |
endcase |
endif |
return |
|
Une discussion intéressante sur d'autres solutions en ooDML pour imiter
le fonctionnement de SET CARRY :
Groupes de discussion : dbase.programming
De : "J. Trouwborst" <no_spam_j.trouwbo...@hetnet.nl>
Date : Sun, 25 May 2003 19:36:42 +0200
Date/heure locale : Dim 25 mai 2003 19:36
Objet : Filling a row with data from previous row
et si l'allemand vous est familier (car AMHA google translator est assez
restreint dans le sens allemand vers français)
Groupes de discussion : dbase.deutsch
De : "Roland Wingerter" <RWinger...@t-online.de>
Date : Tue, 9 Apr 2002 22:50:54 +0200
Date/heure locale : Mar 9 avr 2002 22:50
Objet : Re: set carry kopiert immer letzten Datensatz
retour
Sources :
Aide Visual dbase V5.5
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm
Base de connaisance dUFLP
Si vous voyez des erreurs, n'hésitez pas à le signaler.
Dernière modification : vendredi 06 août 2010
© M.A.