ATOUTFOX
    COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO

Forum AtoutFox

Le forum AtoutFox

Forum

RSS © www.atoutfox.org - Forum

Re: Importation fichier TSV - caractères accentués
Bonne après-midi,

Je pense avoir trouvé, en farfouillant sur le net, une solution assez propre et générique qui, dans mon cas, fonctionne apparemment correctement. En voici le code :
[VFP]
* gestion de la table destinatrice qui doit être vide
IF NOT USED("Journal1")
SELECT 0
USE journal1
ENDIF

SELECT journal1
* évite toutes les demandes du système
SET SAFETY OFF
ZAP

*conversion du fichier UTF-8 en Double
lcMyFile =STRCONV(FILETOSTR("Fabrique 23 - 2020 - Export Vfp9 (10).tsv"),11)
STRTOFILE(lcMyFile,"myNewFile.txt")

*restaure la sécurité des données
SET SAFETY ON

*importation et visualisation des données importées
SELECT journal1
APPEND FROM myNewFile.txt DELIMITED WITH tab
BROWSE last NOWAIT
[/VFP]

Voilà, voilà

Guy.


Fri, 23 Jul 2021 18:32:04 GMT

Importation fichier TSV - caractères accentués
Bonjour à tous,

Je me trouve dans une situation gênante avec les codes pages à l'occasion d'un append from d'un fichier TSV (en fait un fichier CSV délimité par TAB)
J'utilise windows 10 (à jour complet à ce jour 23 juillet) 64bits et vfp9

A partir d'une feuille de calcul Google Sheet, je crée un fichier TSV délimité par Tabulation (nb:Google sheet ne permet que l'exportation vers un CSV classique : séparation par virgule ou TSV - d'autres formats sont possibles mais ce n'est pas l'objet ici).
Quand j'examine le fiche par un éditeur de type NotePad++, je constate que tout se passe parfaitement, que tous les champs nécessaires sont présents et les caractères accentués correspondent parfaitement.

Au moment de l'importation dans la table Vfp (codepage de la table 1252) par l'instruction
[vfp]append from "c:\users\....Export Vfp9.tsv" delimited with TAB as 1252[/vfp]
je constate que la table Vfp a remplacé les caractères accentués par une combinaison de type "Aª" pour le "ê" par exemple et de plus certaines colonnes ne sont pas reprises dans l'importation.
Si je modifie le codepage à l'importation, j'obtiens, toujours dans l'exemple du "ê" la chaîne "+¬" pour les codepage 850 et 1250
lecodepage 437 donne le même résultat que le 1252.

Le fichier source TSV est encodé en UTF-8.
Il n'y a pas de config.fpw dans le répertoire
La table est indépendante

Comment pourrais-je me sortir de ce guépier et obtenir immédiatement les bons caractères ?

Merci d'avance

Guy


Fri, 23 Jul 2021 18:32:04 GMT

Re: Windows 11 Compatible avec vfp ?
Bonjour,
Windows 11 ne s'installera que sur des processeurs 64 bit.
Et supportera des applis 32 bit comme vfp
Voir ici en bas https://nerdschalk.com/can-windows-11-run-on-a-32-bit-processor/




Wed, 21 Jul 2021 18:32:04 GMT

Windows 11 Compatible avec vfp ?
Bonjour,
Windows 11 Compatible avec vfp ?


Wed, 21 Jul 2021 18:32:04 GMT

Résolution de l'état avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Chers Collègues,
J'ai le plaisir de porter à votre connaissance que mon problème de "Report avec une table parent et plusieurs tables enfants (4 ou 5) a trouvé sa solution grâce à votre aimable collaboration et votre disponibilité. Je vous adresse mes sincères remerciements pour votre esprit de solidarité. Mais permettez-moi d'adresser des remerciements particuliers à Jean Maurice qui a bien voulu me faire profiter son expérience personnelle en le sujet. Après de fructueux échanges sur le problème, on a débouché sur un résultat définitif formidable. Compte de la paternité de Jean sur le sujet, je lui laisse si besoin est, de publier à votre intention son modèle qui a contribué à la résolution du problème.
Merci à tous et bonne journée.
Damonzon.


Wed, 30 Jun 2021 18:32:04 GMT

Re: App automatically opens default browser with atoutfox.org
Hi,
This behaviour can't come from scratch, it would be magic :-)
You could verify if there is a file called "config.fpw" beside the executable and edit it : perhaps it runs a command calling the atoutfox url. If not, I don't know...
JC


Wed, 23 Jun 2021 18:32:04 GMT

App automatically opens default browser with atoutfox.org
Good afternoon,

We have an app at work which uses FoxPro for database and after we open it, it automatically opens up the default browser with atoutfox.org/ip.asp. The developer of the app says it's not their fault, can you please help us with this problem?

Thank you so much for your help!


Wed, 23 Jun 2021 18:32:04 GMT

Re: Impossibilité de restaurer la base VFP9 sur le serveur
Damonzon a couché sur son écran :
> Bonjour Guy,
> Merci pour cette suite. Est ce à créer une routine qui va tourner en
> permanence en tâche de fond ? Ou peut on l'acquérir ? Bon dimanche.
> Damonzon.

Personellement, il tournait sur le serveur en paramétrant les temps et
la sorte de backup désiré complet (zip en option), avec incrémentation
du nom_1, 2 etc.
Ou un seul en ne sauvant que les records modifiés ou nouveau record.
Dans la version de base, les fichiers ouverts sont simplement ignorés.
Si ton serveur reste ouvert il est possible d'utiliser la version de
base, hors heures de travail et autres travaux? pour tester.
Rien empêche d'avoir une version sur un poste de travail (jamais
testé)
Sauf personellement pour automtiser mes backup sur NAS.
Je pensais l'utiliser pour le cloud pas encore testeé.

Bon travail
Guy

--
Guy Bonemme

--
Cet email a fait l'objet d'une analyse antivirus par AVG.
http://www.avg.com

Thu, 17 Jun 2021 18:32:04 GMT

Re: Callback function winapi WINMM midiinopen
bonne journée,

Ce qui se passe, c'est que la fonction de rappel pour ouvrir le périphérique midi in est exécutée, le midiinop+start est exécuté sans erreur et l'exécution du programme passe à "READ EVENTS" comme il se doit. Si vous appuyez sur une touche du MIDI de l'appareil, le programme se ferme sans message d'erreur ni appel de la fonction de rappel.

Meilleures salutations,

Jan Flikweert


Thu, 17 Jun 2021 18:32:04 GMT

Callback function winapi WINMM midiinopen
Bonjour,

Je travaille sur un programme pour traiter l'entrée midi. J'utilise WINAPI winmm midiinopen+start. Il est possible d'ouvrir un périphérique midi in. Le programme utilise alors la fonction de rappel définie. C'est positif. Après cela, la fonction de rappel cesse de répondre. Je n'ai pas non plus de message d'erreur. Voici mon exemple de code. Qui peut m'aider?

[vfp]
Declare INTEGER midiInStart In Winmm integer hmi
Declare INTEGER midiInOpen In Winmm;
INTEGER @lphmi, INTEGER uDeviceID ,;
INTEGER dwCallback, INTEGER dwCallbackInstance, INTEGER dwFlags
#INCLUDE vfp2c.h
SET LIBRARY TO vfp2c32.fll ADDITIVE && Library with callback funtion
PUBLIC loCallback AS object, nDevice AS integer
loCallBack = CREATEOBJECT('cls_callback')
nDevice=nChosenMidiInDevice-1 && index midi input device 1 based, WINAPI is 0 based!
ON ERROR errorhandling() && To detect errors I added errorhandling
nResult_open_midi_in = midiInOpen(@hDevice,nDevice, loCallBack.Address,0, CALLBACK_FUNCTION) && Adviced is CALLBACK_FUNCTION OR MIDI_IOSTATUS
&& At startup previous line does use/execute callback
MESSAGEBOX(STR(nResult_open_midi_in)) &&Returns at startup "0".
nResult_midi_in_start = midiInStart(hDevice)
MESSAGEBOX(STR(nResult_midi_in_start)) &&Returns at startup: "0".
READ EVENTS
DEFINE CLASS cls_callback AS custom &&class with callback. Other baseclass?
&& DEFINE CLASS cls_callback AS Session
&& DEFINE CLASS cls_callback AS Exception
Address = 0

FUNCTION Init
THIS.Address = CreateCallbackFunc('Test_Callback_function','BOOL','INTEGER,INTEGER,INTEGER,INTEGER,INTEGER',THIS)
ENDFUNC

FUNCTION Destroy
IF THIS.Address != 0
DestroyCallbackFunc(THIS.Address)
ENDIF
ENDFUNC

FUNCTION Test_Callback_function(hDevice,iMsg,dwinstance,lParam1,lParam2) && Or @hDevice
DO CASE
CASE iMsg=MIM_DATA
_VFP.AutoYield = .F.
MESSAGEBOX("Data: Callback function used for data input.")
_VFP.AutoYield = .T.
CASE iMsg=MIM_OPEN
_VFP.AutoYield = .F.
MESSAGEBOX("Open: Callback function used to open device.")
_VFP.AutoYield = .T.
CASE iMsg=MIM_MOREDATA
_VFP.AutoYield = .F.
MESSAGEBOX("More: Callback received again input.")
_VFP.AutoYield = .T.
OTHERWISE
_VFP.AutoYield = .F.
MESSAGEBOX("Other. Return value:"+CHR(13)+STR(iMsg))
_VFP.AutoYield = .T.
ENDCASE
ENDFUNC
ENDDEFINE
[/vfp]

Salutions,


Jan Flikweert


Thu, 17 Jun 2021 18:32:04 GMT

Re: Impossibilité de restaurer la base VFP9 sur le serveur
Re bonjour Guy,
j'ai trouvé des versions d'essai sur le web. je voudrai savoir si le produit doit être installé sur la machine dédiée serveur ou sur un poste client ?
Merci.


Sun, 13 Jun 2021 18:32:04 GMT

Re: Impossibilité de restaurer la base VFP9 sur le serveur
Bonjour Guy,
Merci pour cette suite. Est ce à créer une routine qui va tourner en permanence en tâche de fond ? Ou peut on l'acquérir ?
Bon dimanche.
Damonzon.


Sun, 13 Jun 2021 18:32:04 GMT

Re: Impossibilité de restaurer la base VFP9 sur le serveur
Il se trouve que Damonzon a formulé :
> Chers collègues,
> De plus en plus, certains de mes clients ont du mal à faire des sauvegardes
> de la base de données sur leurs serveurs, qu'ils soient professionnels ou PC
> dédiés comme tel. A l'inverse, il est totalement impossible de faire des
> restaurations quelques soient les serveurs, je suis obligé de décompresser la
> base puisque c'est en format .ZIP et ensuite faire des copies dans le
> répertoire prévu pour cela. Je rappelle que les serveurs sont W2008 R2 et
> W2019; et les PC sont W10 Pro ou W7 Pro. Merci d'avance. Bonne Journée.
> Damonzon

Bonjour,
Pourquoi ne pas utiliser 'syncback' qui tourne sur les serveurs.
la version payante effectue également les copies 'à chaud'
Je l'ai utilisé dans un bureau d'avocat, avec un backup toute les 15
minutes.
Guy Bonemme

--
Guy Bonemme

--
Cet email a fait l'objet d'une analyse antivirus par AVG.
http://www.avg.com

Sun, 13 Jun 2021 18:32:04 GMT

Impossibilité de restaurer la base VFP9 sur le serveur
Chers collègues,
De plus en plus, certains de mes clients ont du mal à faire des sauvegardes de la base de données sur leurs serveurs, qu'ils soient professionnels ou PC dédiés comme tel. A l'inverse, il est totalement impossible de faire des restaurations quelques soient les serveurs, je suis obligé de décompresser la base puisque c'est en format .ZIP et ensuite faire des copies dans le répertoire prévu pour cela. Je rappelle que les serveurs sont W2008 R2 et W2019; et les PC sont W10 Pro ou W7 Pro.
Merci d'avance.
Bonne Journée.
Damonzon


Thu, 10 Jun 2021 18:32:04 GMT

Re: =c3=a9tat avec 2 bandes d=c3=a9tail
Bonjour Jean,
Si tu as une solution, Jean - cela me va. Faut pas que ce soit la mienne.
Autres avantages de préparer un curseur
(1) Il faut moins se battre avec l'éditeur des états, sql est beaucoup plus facile
(2) Il y même un moyen d'avoir les totaux au niveau de l'entête.



Mon, 07 Jun 2021 18:32:04 GMT

Re: =c3=a9tat avec 2 bandes d=c3=a9tail
Bonjour Gregory,

c'est une idée ! J'en utilise une autre que j'ai commencé à mettre en oeuvre
pour Damonzon : le contenu de chaque bande détail est dans un champ memo avec
une ligne dans le champ par ligne à mettre dans la bande et chaque ligne étant
formatée ad hoc. Les champs de l'état ont donc comme expression quelque chose
comme SUBSTR(MLINE(test.det1, 2), 10, 2) avec des print when et (en français)
'enlever la ligne si rien à y imprimer'.

Je testerai ta solution après la mienne.

Bonne journée à tous

Jean à Grenoble
Mon, 07 Jun 2021 18:32:04 GMT

Re: =c3=a9tat avec 2 bandes d=c3=a9tail
Bonjour Jean,
Une solution est de créer un curseur qui contient le tout et aussi un champ group qui identifie ce qu'il y a à imprimer.
La valeur du champ group dira quels champs il faut imprimer (utiliser Print When) et aussi quelle sera l'entête du groupe à imprimer.
Créer ce curseur est une tache pénible, mais bon, c'est ce que je fais.

[vfp]
create cursor Employe;
( Id I, ;
Nom c(20) ;
)
create cursor Salaire ;
( Id I, ;
ParentId I, ;
Prime Y,;
DatePrime D;
)

create cursor Retenue ;
( Id I, ;
ParentId I, ;
Montant Y,;
DateMontant D ;
)
insert into Employe values (1, 'Jean')

insert into Salaire values (1, 1, $100, {^2021/01/01})
insert into Salaire values (1, 1, $1050, {^2021/02/01})
insert into Retenue values (1, 1, $50, {^2021/01/03})
insert into Retenue values (1, 1, $75, {^2021/02/02})

select Employe.Id, ;
Employe.Nom, ;
'1' as group, ;
Salaire.Prime,;
Salaire.DatePrime, ;
$0 as Montant, ;
{} as DateMontant ;
from Employe ;
join Salaire on Salaire .ParentId == Employe.Id ;
union all ;
select Employe.Id, ;
Employe.Nom, ;
'2' as group, ;
$0 as Prime,;
{} as DatePrime, ;
Retenue . Montant, ;
Retenue.DateMontant ;
from Employe ;
join Retenue on Retenue .ParentId == Employe.Id ;
order by 1, 3, 5, 7 ;
into cursor tmp readwrite
[/vfp]


Mon, 07 Jun 2021 18:32:04 GMT

Re: =c3=a9tat avec 2 bandes d=c3=a9tail
Bonjour Jean,
J'avais essayé cela, et j'ai eu le même résultat. Je croyais n'avoir
pas bien fait, j'attendais donc que tu aies un meilleur résultat.
Pour autant, la recherche va continuer.
Merci.
Bonne journée.
Damonzon.


Mon, 07 Jun 2021 18:32:04 GMT

Re: =c3=a9tat avec 2 bandes d=c3=a9tail
J'ai eu beaucoup de mal à retrouver mes repères après tant de temps !

J'ai bien pu mettre 2 bandes détail dans un report mais ces deux bandes ne sont
pas indépendantes. On ne peut pas avoir sur la première bande de détail les
informations d'une table en relation avec la table mère (salaire, primes, ...)
et sur la deuxième bande les informations d'une deuxième table en relation avec
la même table mère (retenues sociales, ...)

Mais le comportement de l'état est un peu curieux car je me retrouve avec
beaucoup de lignes incomplètes ou vides.


Jean à Grenoble
Sun, 06 Jun 2021 18:32:04 GMT

Re: =c3=a9tat avec 2 bandes d=c3=a9tail
ok, je regarde ...

merci de l'information !

Jean à Grenoble
Fri, 04 Jun 2021 18:32:04 GMT

Re: =c3=a9tat avec 2 bandes d=c3=a9tail
Bonjour Jean
Il peut y avoir plusieurs bandes détails.. en VFP9 SP2.
Dans l'éditeur de REPORT tu trouveras un bouton pour ajouter des bandes détails supplémentaires..

A+
Gilles



Thu, 03 Jun 2021 18:32:04 GMT

=c3=a9tat avec 2 bandes d=c3=a9tail
Bonjour à tous,

je suis en train (!) d'aider Damonzon à créer une application. Il veut éditer un
bulletin de salaire. Dans ce bulletin, il devrait y avoir une première bande de
détail concernant le salaire, les primes, les remboursements, etc et une
deuxième bande contenant les cotisation, retenues, ...

Est-ce qu'il est possible d'avoir 2 bandes détail dans un état VFP. A mon avis
non, mais je voudrais une confirmation.

Bonne journée à tous

Jean à Grenoble
Thu, 03 Jun 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour,
J'ai fait le test, tous les curseurs intermédiaires ramènent avec la colonne nbre avec 1 record. Seul le curseur final, à savoir : bulletin ramène des nombres effarants de records. On compte souvent plus de 100 de fois le même numéro matricule.
Ci-après la requête.
Bon après midi.
Lc_societe = societe.societe
Lc_periode = societe.datepaie
SELECT bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullent.salbase,bullent.salnet,bullent.salbrut,;
bullent.typsal,bullent.pnet,bullent.sitfam,bullent.conv,bullent.categ,bullent.classific,bullent.dept,bullent.serv,bullent.fonction,;
bullent.nbrenf,bullent.datentre,bullent.nbrpart,bullent.numsecu,bullent.modepaie,bullent.nomjfille,bullent.nom,bullent.prenoms, ;
bullent.nbull,bullent.freq,bulldet.societe as detsoc,bulldet.periode as detper,bulldet.matricule as matdet,;
bulldet.clef as clefdet,bulldet.coderub,bulldet.librub,;
SUM(bulldet.montant) as montdet,SUM(bulldet.nbrebase) as nbredet,SUM(bulldet.taux) as tauxdet,SUM(bulldet.tauxits) as itsdet,;
SUM(bulldet.tauxret) as retdet,bulldet.cmotif, COUNT(*) as nbrecords_ent;
FROM bullent ;
INNER Join bulldet On bullent.entid=bulldet.detid AND bullent.societe=bulldet.societe AND bullent.matricule=bulldet.matricule AND;
bullent.clef=bulldet.clef AND bullent.periode=bulldet.periode;
GROUP BY bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullent.salbase,bullent.salnet,bullent.salbrut,;
bullent.typsal,bullent.pnet,bullent.sitfam,bullent.conv,bullent.categ,bullent.classific,bullent.dept,bullent.serv,bullent.fonction,;
bullent.nbrenf,bullent.datentre,bullent.nbrpart,bullent.numsecu,bullent.modepaie,bullent.nomjfille,bullent.nom,bullent.prenoms, ;
bullent.nbull,bullent.freq,bulldet.societe,bulldet.periode,bulldet.matricule,bulldet.clef,bulldet.coderub,bulldet.librub,;
bulldet.montant,bulldet.nbrebase,bulldet.taux,bulldet.tauxits,bulldet.tauxret,bulldet.cmotif ;
WHERE bullent.societe=Lc_societe AND bullent.periode=Lc_periode AND !DELETED("bullent");
INTO CURSOR cursdet

SELECT bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullcharg.societe as chargsoc,bullcharg.periode as chargper,bullcharg.matricule as matcharg,;
bullcharg.clef as clefcharg,bullcharg.chargid,bullcharg.coderub as rubcharg,bullcharg.librub as libcharg,SUM(bullcharg.montant) as montcharg,;
SUM(bullcharg.nbrebase) as nbrecharg,SUM(bullcharg.taux) as tauxcharg,bullcharg.codcharg, COUNT(*) as nbrecords_charg;
FROM bullent ;
INNER Join bullcharg On bullent.entid=bullcharg.chargid AND bullent.societe=bullcharg.societe AND bullent.matricule=bullcharg.matricule AND;
bullent.clef=bullcharg.clef AND bullent.periode=bullcharg.periode;
GROUP BY bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullcharg.societe,bullcharg.periode,bullcharg.matricule,;
bullcharg.clef,bullcharg.chargid,bullcharg.coderub,bullcharg.librub,bullcharg.montant,bullcharg.nbrebase,;
bullcharg.taux,bullcharg.codcharg;
WHERE bullent.societe=Lc_societe AND bullent.periode=Lc_periode AND !DELETED("bullent");
INTO CURSOR curscharg

SELECT bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullnet.societe as netsoc,bullnet.periode as netper,bullnet.matricule as matnet,;
bullnet.clef as clefnet,bullnet.netid,bullnet.coderub as rubnet,bullnet.librub as libnet,SUM(bullnet.montant) as montnet,SUM(bullnet.nbrebase) as nbrenet,;
SUM(bullnet.taux) as tauxnet, COUNT(*) as nbrecords_net;
FROM bullent ;
INNER Join bullnet On bullent.entid=bullnet.netid AND bullent.societe=bullnet.societe AND bullent.matricule=bullnet.matricule AND;
bullent.clef=bullnet.clef AND bullent.periode=bullnet.periode;
GROUP BY bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullnet.societe,bullnet.periode,bullnet.matricule,;
bullnet.clef,bullnet.netid,bullnet.coderub,bullnet.librub,bullnet.montant,bullnet.nbrebase,bullnet.taux ;
WHERE bullent.societe=Lc_societe AND bullent.periode=Lc_periode AND !DELETED("bullent");
INTO CURSOR cursnet

SELECT bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bulltiers.societe as tiersoc,bulltiers.periode as tiersper,bulltiers.matricule as matiers,;
bulltiers.clef as cleftiers,bulltiers.tiersid,bulltiers.coderub as rubtiers,bulltiers.librub as libtiers,SUM(bulltiers.montant) as montiers,;
SUM(bulltiers.nbrebase) as nbretiers,SUM(bulltiers.taux) as tauxtiers, COUNT(*) as nbrecords_tiers;
FROM bullent ;
INNER Join bulltiers On bullent.entid=bulltiers.tiersid AND bullent.societe=bulltiers.societe AND bullent.matricule=bulltiers.matricule AND;
bullent.clef=bulltiers.clef AND bullent.periode=bulltiers.periode;
GROUP BY bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bulltiers.societe,bulltiers.periode,bulltiers.matricule,;
bulltiers.clef,bulltiers.tiersid,bulltiers.coderub,bulltiers.librub,bulltiers.montant,;
bulltiers.nbrebase,bulltiers.taux ;
WHERE bullent.societe=Lc_societe AND bullent.periode=Lc_periode AND !DELETED("bullent");
INTO CURSOR curstiers

SELECT bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullcum.cumid,bullcum.baseamo,bullcum.baseconge,;
bullcum.baseimpot,bullcum.baseinps,bullcum.jrscong,bullcum.jrspres,bullcum.retamo,bullcum.retimpot,bullcum.retinps,;
bullcum.salbrut, COUNT(*) as nbrecords_cum;
FROM bullent ;
INNER Join bullcum On bullent.entid=bullcum.cumid AND bullent.societe=bullcum.societe AND bullent.matricule=bullcum.matricule AND;
bullent.clef=bullcum.clef AND bullent.periode=bullcum.periode;
GROUP BY bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullcum.cumid,bullcum.baseamo,bullcum.baseconge,;
bullcum.baseimpot,bullcum.baseinps,bullcum.jrscong,bullcum.jrspres,bullcum.retamo,bullcum.retimpot,bullcum.retinps,;
bullcum.salbrut ;
WHERE bullent.societe=Lc_societe AND bullent.periode=Lc_periode AND !DELETED("bullent");
INTO CURSOR curscum

SELECT cursdet.periode,cursdet.matricule,cursdet.clef,cursdet.entid,cursdet.coderub, ;
COUNT(*) AS nbrecordstmp ;
FROM cursdet ;
WHERE cursdet.societe=Lc_societe AND cursdet.periode=Lc_periode ;
GROUP BY cursdet.periode, cursdet.matricule, cursdet.clef,cursdet.entid, cursdet.coderub ;
INTO CURSOR bulltmp

SELECT bulltmp.nbrecordstmp, cursdet.*, ;
curscharg.rubcharg,curscharg.libcharg ,curscharg.montcharg, curscharg.nbrecharg, ;
curscharg.tauxcharg,curscharg.codcharg, cursnet.rubnet, cursnet.libnet, cursnet.montnet, ;
cursnet.nbrenet, cursnet.tauxnet, curstiers.rubtiers, curstiers.libtiers, curstiers.montiers, ;
curstiers.nbretiers, curstiers.tauxtiers, curscum.baseamo, curscum.baseconge, curscum.baseimpot, ;
curscum.baseinps,curscum.jrscong, curscum.jrspres, curscum.retamo, curscum.retimpot, ;
curscum.retinps, curscum.salbrut, NVL(societe.numsecu,SPACE(15)) as numorg, ;
NVL(societe.numfisc,SPACE(15)) as nfiscal, societe.libelabg as libsoc, ;
societe.datepaie AS datpaie,ville.libelong As libville, ;
NVL(motif.libelabg,SPACE(15)) as libmotif, nbull.libelle as libbull, ;
tfreq.libelle as libfreq, conge.datedebut, conge.datefin ;
FROM bulltmp ;
INNER JOIN cursdet ON bulltmp.periode = cursdet.periode AND bulltmp.matricule = cursdet.matricule ;
AND bulltmp.clef = cursdet.clef AND bulltmp.coderub= cursdet.coderub ;
Left Outer Join cursnet On cursdet.matricule=cursnet.matricule AND cursdet.clef=cursnet.clef AND ;
cursdet.societe=cursnet.societe AND cursdet.periode=cursnet.periode ;
INNER Join curscharg On cursdet.matricule=curscharg.matricule AND cursdet.clef=curscharg.clef AND;
cursdet.societe=curscharg.societe AND cursdet.periode=curscharg.periode;
INNER Join curstiers On cursdet.matricule=curstiers.matricule AND cursdet.clef=curstiers.clef AND;
cursdet.societe=curstiers.societe AND cursdet.periode=curstiers.periode;
INNER Join curscum On cursdet.matricule=curscum.matricule AND cursdet.clef=curscum.clef AND;
cursdet.societe=curscum.societe AND cursdet.periode=curscum.periode;
Left Outer Join societe On cursdet.societe=societe.societe;
Left Outer Join ville On societe.pays=ville.codpays AND societe.ville=ville.codvil;
Left Outer Join motif On cursdet.societe=motif.societe AND cursdet.nbull=motif.codmotif;
Left Outer Join nbull On cursdet.societe=nbull.societe AND cursdet.nbull=nbull.code;
Left Outer Join tfreq On cursdet.societe=tfreq.societe AND cursdet.nbull=tfreq.nbull AND cursdet.freq=tfreq.freq;
Left Outer Join conge On cursdet.matricule=conge.matricule AND cursdet.clef=conge.clef AND cursdet.societe=conge.societe AND;
cursdet.periode=conge.datepaie;
ORDER BY bulltmp.periode, bulltmp.matricule, bulltmp.clef, bulltmp.entid,bulltmp.coderub ;
INTO CURSOR bulletin



Fri, 28 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,
Ok, je vais l'expérimenter pour voir ce que ça donne. Je t'ai envoyé par @ le modèle de document que je voudrai imprimer, je pense que ça expliquera mieux ce que je veux. Tu verras là-dessus le pourquoi des tables détails.
Merci.
Bonne journée.


Fri, 28 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonsoir,
je viens de t'envoyer une solution éventuelle sur ton @ privée. Peux-tu la
tester ? En fait je ne sais pas trop ce que tu veux faire ...

Bonne soirée
Jean
Wed, 26 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,
J(ai fait la jointure avec toutes tables requises dans l'élaboration de mon report. Maintenant je me demande comment ajouter les colonnes dont j'ai besoin venant de ma table "BULLENT" sans être obligé d'utiliser la clause GROUP BY.

Ci-après la dernière requête selon ta deuxième solution

Lc_societe = societe.societe
Lc_periode = societe.datepaie
SELECT entid, societe, matricule, clef, periode ;
FROM bullent ;
WHERE societe=m.Lc_societe AND periode= m.Lc_periode ;
AND !DELETED("bullent") ;
INTO CURSOR ent1snodel READWRITE && peut servir pour tous les tests

SELECT ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode, ;
COUNT(*) AS nbre ;
FROM ent1snodel ent;
Left Outer Join bulldet det ON ent.entid=det.detid AND ;
ent.societe=det.societe AND ent.matricule=det.matricule AND ;
ent.clef=det.clef AND ent.periode=det.periode ;
Left Outer Join bullcharg charg ON ent.entid=charg.chargid AND ;
ent.societe=charg.societe AND ent.matricule=charg.matricule AND ;
ent.clef=charg.clef AND ent.periode=charg.periode ;
Left Outer Join bullnet bnet ON ent.entid=bnet.netid AND ;
ent.societe=bnet.societe AND ent.matricule=bnet.matricule AND ;
ent.clef=bnet.clef AND ent.periode=bnet.periode ;
Left Outer Join bulltiers btiers ON ent.entid=btiers.tiersid AND ;
ent.societe=btiers.societe AND ent.matricule=btiers.matricule AND ;
ent.clef=btiers.clef AND ent.periode=btiers.periode ;
Left Outer Join bullcum bcum ON ent.entid=bcum.cumid AND ;
ent.societe=bcum.societe AND ent.matricule=bcum.matricule AND ;
ent.clef=bcum.clef AND ent.periode=bcum.periode ;
GROUP BY ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode ;
HAVING COUNT(*) > 1 ;
INTO CURSOR test1

Bonne journée.
Damonzon.


Wed, 26 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,
Je constate que dans le curseur final, il faut que toutes les colonnes sélectionnées figurent dans la clause GROUP BY oui ou non? Si oui, il faudrait me conseiller une astuce ou technique, parce que en toute franchise, je ne le sais.
Bonne journée.
Damonzon.


Wed, 26 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Non, je n'ai jamais travaillé avec les vues. C'est une expérience que
je n'ai jamais essayée.
Bonne journée.
Damonzon.


Tue, 25 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
ok.

As-tu déjà créé des vues ?

Bonne journée
Jean
Tue, 25 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,
Elles appartiennent toutes à un .DBC.
Je ne travaille qu'avec les bases de données VFP.
Bonne journée.
Damonzon.


Tue, 25 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonsoir,

est-ce que tes tables appartiennent à une base de données (un .DBC) ?

Cordialement,

Jean à Grenoble
Mon, 24 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonsoir Jean,
J'avais travaillé avec la première solution, et j'avais de résultats satisfaisant avec les curseurs intermédiaires, malheureusement avec une rupture pendant le weekend. qu'à cela ne tienne je vais me conformer à la dernière proposition, on verra ce que ça va donner. A l'intention de Gregory, par reflexe j'avais toujours SET DELETED ON dans mon environnement de données.
A bientôt.
Damonzon.



Mon, 24 May 2021 18:32:04 GMT

Re: trouver IP d'un site Web

Bonjour,

J'ai trouvé votre contribution sur ATOUTFOX pour retrouver l'adresse IP depuis un nom.

Merci.

A.MAHALLA


Mon, 24 May 2021 18:32:04 GMT

Re: trouver IP d'un site Web
Bonjour et merci pour votre réponse.

Dans la fenêtre de commande (CMD) : oui, mais j'aurais dû ajouter 'Par programmation en VFP9' pardon pour cette imprécision.

Bonne journée.

A.MAHALLA


Mon, 24 May 2021 18:32:04 GMT

Re: trouver IP d'un site Web
Dans la fenetre de commande
Ping www.atoutfox.org



Mon, 24 May 2021 18:32:04 GMT

Re: trouver IP d'un site Web
Dans la fenetre de commande
Ping www.atoutfox.com



Mon, 24 May 2021 18:32:04 GMT

Re: Koen Piller
Il était aussi à la conférence que j'ai fais pour Atoutfox en 2012 à Paris


Mon, 24 May 2021 18:32:04 GMT

trouver IP d'un site Web
Bonjour,

Paix sur l'âme de Koen PILLER.

Peut on retrouver l'adresse IP d'un site web /ou l'inverse

Merci pour vos suggestions et bonne journée.

A.MAHALLA


Mon, 24 May 2021 18:32:04 GMT

Re: Koen Piller
Exact...
Et ça ne nous rajeunit pas non plus...
JC


Mon, 24 May 2021 18:32:04 GMT

Re: Koen Piller
Problème de lien
Ici http://www.atoutfox.org/rencontres2013/photos2013/index.html

Photos 15 et 27



Mon, 24 May 2021 18:32:04 GMT

Re: Koen Piller
Bonjour
Mais si, jc, tu le connais. Il a été aux rencontres de 2013
Voici quelques photos
http://www.atoutfox.org/rencontres2013/photos2013/slides/IMG_0812%20[1024x768].html
http://www.atoutfox.org/rencontres2013/photos2013/slides/IMG_0867%20[1024x768].html

cdlt,


Mon, 24 May 2021 18:32:04 GMT

Re: Koen Piller
Bonjour,
Koen venait de temps à autre sur ce groupe.
Je ne le connaissais pas, mais je pense que c'était le cas de plusieurs de nos membres. Meilleures pensées à eux et pour lui.
JC



Mon, 24 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,

Quant à Dieu - n'exagérons pas.

Je voulais juste montrer que WHERE DELETED(curseur) ne se comporte pas comme on pourrait le croire. Il n'y a que WHERE DELETED() qui marche si la requête se fait sur une seule table.
J'ai toujours SET DELETED ON dans toutes mes sessions de données, alors je n'en ai pas besoin.
La seule fois où j'en ai eu besoin était avec ODBC quand je faisais mes premiers pas en foxpro.
Et je vois qu'on peut le spécifier dans la chaîne de connexion.
https://www.connectionstrings.com/microsoft-visual-foxpro-odbc-driver/



Sun, 23 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Gregory,

ce n'est pas du tout mon habitude d'utiliser DELETE, SET DELETED ... et surtout
d'effacer des lignes (je suis très conservateur !). Depuis toujours (y compris
dans mes années DBASE3 !), dans chaque table j'ai un champ date (puis datetime)
appelé DATANULMOD et un champ 1 caractère appelé ORGMODIF.

Les lignes valident ont DATANULMOD vide et, a priori, 'C' dans ORGMODIF. Les
indexs filtrent ce champ vide.

Pour modifier une ligne, je met la date de suppression dans DATANULMOD et 'M'
dans orgmodif. Normalement, donc, je dois avoir une nouvelle ligne avec la même
clef mais avec DATANULMOD vide.
Pour supprimer une ligne, je met la date de suppression dans DATANULMOD et 'S'
dans orgmodif. Je ne dois donc pas avoir de nouvelle ligne.

Cela permet des choses comme :
revenir en arrière en cas d'erreur.
voir l'historique des modifications.
purger les lignes obsolètes trop vieilles (et encore là, je ne supprime pas
les lignes mais je les transfert dans une table ayant le même nom que la table
courante mais avec '_old' à la fin du nom !).
exporter les tables vers PostGre sans modification.

Donc, je n'ai pas trop percuté sur ton message à part mettre ce DELETED() dans
une requête sur une seule table.

Damonzon, Gregory est à VFP ce que Dieu est à l'humanité !! S'il dit de mettre
SET DELETED ON, c'est qu'il faut le faire ;-)

Bon week-end à tous

Jean à Grenoble
Sun, 23 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,

Tu n'as pas vu ce message ? http://atoutfox.com/nntp.asp?ID=0000019839

Le mieux est de faire
[vfp]
Set Deleted on
<[vfp]
et plus besoin d'utiliser deleted()



Sun, 23 May 2021 18:32:04 GMT

Koen Piller
https://www.foxite.com/archives/koen-passed-away-0000482805.htm


Sat, 22 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjouur Damonzon,
je crois que j'ai commis une petite erreur dans mes exemples de test. Peux-tu
essayer de faire les mêmes tests mais comme cela :

SELECT entid, societe, matricule, clef, periode ;
FROM bullent ;
WHERE societe=m.Lc_societe AND periode= m.Lc_periode ;
AND !DELETED("bullent") ;
INTO CURSOR ent1snodel READWRITE && peut servir pour tous les tests

SELECT ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode, ;
COUNT(*) AS nbre ;
FROM ent1snodel ent;
Left Outer Join bulldet det ON ent.entid=det.detid AND ;
ent.societe=det.societe AND ent.matricule=det.matricule AND ;
ent.clef=det.clef AND ent.periode=det.periode ;
GROUP BY ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode ;
HAVING COUNT(*) > 1 ;
INTO CURSOR test1

la logique de cela : J'ai reporté dans une requête sur une seule table le test
DELETED() et aussi les tests sur société et période. VFP peut simplifier une
telle requete et la transformer en SET FILTER. Comme je ne veux pas celà, j'ai
ajouter la clause READWRITE. Cette requête n'est pas à recalculer pour chaque test.

Dans la deuxième requête, je ne traite que les champs qui apparaissent dans la
jointure parce qu'on cherche des doublons sur ces champs uniquement.

Tu peux essayer ?

Jean à Grenoble
Sat, 22 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,
J'ai fait des tests avec toutes les tables suivant votre requête et conformément aux différentes option de DELETED(), tous les curseurs ont été vides. Et chaque fois que j'ai enlevé la clause HAVING COUNT(*) > 1 aucun curseur ne contenait des doublons, la colonne COUNT(*) AS nbre contenait toujours 1.

Mieux j'ai inversé la démarche en faisant le test sur une jointure entre chacune des autres tables avec "BULLENT", là aussi aucun curseur n'a ramené des doublons. Je crois que la dernière étape consiste à établir des relations et ces curseurs intermédiaires. Ci-après les requêtes utilisées dans les deux démarches.

Démarche 1: Ici la table "BULLCUM" est le dernier test, c'est pour cela qu'elle est ici à la de "BULLDET".

Lc_societe = societe.societe
Lc_periode = societe.datepaie
IF vLancImp=.T.
SELECT bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullent.salbase,bullent.salnet,bullent.salbrut,;
bullent.typsal,bullent.pnet,bullcum.baseamo,bullcum.baseconge,bullcum.baseimpot,bullcum.baseinps,bullcum.jrscong,;
bullcum.jrspres,bullcum.retamo,bullcum.retimpot,bullcum.retinps,bullcum.salbrut, COUNT(*) as nbrecords;
FROM bullent ;
Left Outer Join bullcum On bullent.entid=bullcum.cumid AND bullent.societe=bullcum.societe AND bullent.matricule=bullcum.matricule AND;
bullent.clef=bullcum.clef AND bullent.periode=bullcum.periode;
GROUP BY bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullent.salbase,bullent.salnet,bullent.salbrut,;
bullent.typsal,bullent.pnet,bullcum.baseamo,bullcum.baseconge,bullcum.baseimpot,bullcum.baseinps,bullcum.jrscong,;
bullcum.jrspres,bullcum.retamo,bullcum.retimpot,bullcum.retinps,bullcum.salbrut HAVING COUNT(*) > 1 ;
WHERE bullent.societe=Lc_societe AND bullent.periode=Lc_periode AND !DELETED("bullent");
INTO CURSOR bulletin
ELSE
CLEAR EVENTS
ENDIF

Démarche 2 ;

Lc_societe = societe.societe
Lc_periode = societe.datepaie
IF vLancImp=.T.
SELECT bulldet.societe,bulldet.periode,bulldet.matricule,bulldet.clef,bulldet.detid,bulldet.coderub,;
bulldet.librub,bulldet.montant,bulldet.nbrebase,bulldet.taux,bulldet.tauxits,bulldet.tauxret,;
bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullent.salbase,bullent.salnet,bullent.salbrut,;
bullent.typsal,bullent.pnet, COUNT(*) as nbrecords;
FROM bulldet;
Left Outer Join bullent On bullent.entid=bulldet.detid AND bullent.societe=bulldet.societe AND bullent.matricule=bulldet.matricule AND;
bullent.clef=bulldet.clef AND bullent.periode=bulldet.periode;
GROUP BY bulldet.societe,bulldet.periode,bulldet.matricule,bulldet.clef,bulldet.detid,bulldet.coderub,;
bulldet.librub,bulldet.montant,bulldet.nbrebase,bulldet.taux,bulldet.tauxits,bulldet.tauxret,;
bullent.societe,bullent.periode,bullent.matricule,bullent.clef,bullent.entid,bullent.salbase,bullent.salnet,bullent.salbrut,;
bullent.typsal,bullent.pnet HAVING COUNT(*) > 1;
WHERE bulldet.societe=Lc_societe AND bulldet.periode=Lc_periode AND !DELETED("bulldet");
INTO CURSOR bulletin
ELSE
CLEAR EVENTS
ENDIF

Bon Week-end.
Damonzon


Sat, 22 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
rectificatif !

la liste des champs doit être la même dans la liste des champs et le group by !

SELECT ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode, ;
det.cmotif, det.coderub, det.librub, det.montant, det.nbrebase, det.taux, ;
det.tauxits, det.tauxret, COUNT(*) AS nbre ;
FROM bullent ent;
Left Outer Join bulldet det ON ent.entid=det.detid AND ;
ent.societe=det.societe AND ent.matricule=det.matricule AND ;
ent.clef=det.clef AND ent.periode=det.periode ;
WHERE ent.societe=m.Lc_societe AND bullent.periode= m.Lc_periode AND ;
!DELETED("bullent") ;
GROUP BY ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode, ;
det.cmotif, det.coderub, det.librub, det.montant, det.nbrebase, det.taux, ;
det.tauxits, det.tauxret ;
HAVING COUNT(*) > 1 ;
INTO CURSOR test1

et tu essairas aussi cette requête sans le DELETED(), une fois avec SET DELETED
OFF et une fois avec SET DELETED ON. Car il se pourrait que le problème vienne
de là.

SET DELETED ON
SELECT ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode, ;
det.cmotif, det.coderub, det.librub, det.montant, det.nbrebase, det.taux, ;
det.tauxits, det.tauxret, COUNT(*) AS nbre ;
FROM bullent ent;
Left Outer Join bulldet det ON ent.entid=det.detid AND ;
ent.societe=det.societe AND ent.matricule=det.matricule AND ;
ent.clef=det.clef AND ent.periode=det.periode ;
WHERE ent.societe=m.Lc_societe AND bullent.periode= m.Lc_periode ;
GROUP BY ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode, ;
det.cmotif, det.coderub, det.librub, det.montant, det.nbrebase, det.taux, ;
det.tauxits, det.tauxret ;
HAVING COUNT(*) > 1 ;
INTO CURSOR test1

Bonne journée
Jean
Fri, 21 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonsoir Jean;
Merci pour cet encouragement; je renoue donc avec cette affaire. je te promets jusqu'à la victoire finale.
Je te reviendrai dès que j'aurais fait les tests recommandés.
Bonne fin de journée.
Damonzon.


Thu, 20 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Damonzon,
moi, je n'abandonnerai pas SQL : c'est quand même le meilleur moyen de travailler.

Un moyen de trouver d'où proviennent les doublons et de faire la requête
jointure par jointure en calculant le nombre de lignes en doublon à chaque fois.

Si je reprend un de tes exemples, j'écrirais (non testé!):

Lc_societe = societe.societe
Lc_periode = societe.datepaie
SELECT ent.*, ;
det.cmotif, det.coderub, det.librub, det.montant, det.nbrebase, det.taux, ;
det.tauxits, det.tauxret, COUNT(*) AS nbre ;
FROM bullent ent;
Left Outer Join bulldet det ON ent.entid=det.detid AND ;
ent.societe=det.societe AND ent.matricule=det.matricule AND ;
ent.clef=det.clef AND ent.periode=det.periode;
WHERE ent.societe=m.Lc_societe AND bullent.periode= m.Lc_periode AND ;
!DELETED("bullent");
GROUP BY ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode
HAVING COUNT(*) > 1 ;
INTO CURSOR test1
* le curseur test1 doit être vide. S'il ne l'est pas,
* c'est de cette jointure que proviennent les doublons
* on fait la même chose avec la deuxième jointure

SELECT ent.*, ;
net.coderub as rubnet,net.librub as libnet,net.montant as montnet,;
net.nbrebase as nbrenet,net.taux as tauxnet, COUNT(*) AS nbre;
FROM bullent ent;
Left Outer Join bullnet net On ent.entid=net.netid AND ;
ent.societe=net.societe AND ent.matricule=net.matricule AND ;
ent.clef=net.clef AND ent.periode=net.periode;
WHERE ent.societe=m.Lc_societe AND bullent.periode= m.Lc_periode AND ;
!DELETED("bullent");
GROUP BY ent.entid, ent.societe, ent.matricule, ent.clef, ent.periode
HAVING COUNT(*) > 1 ;
INTO CURSOR test2
* le curseur test2 doit être vide. S'il ne l'est pas,
* c'est de cette jointure que proviennent les doublons
* on fait la même chose avec la troisième jointure

En relisant, j'ai oublié de tester la jointure sur societe. je te laisse écrire
les autres tests !

Une fois que tu auras trouvé le coupable, il faudra réfléchir sur la raison des
doublons.

Tiens nous au courant ! Bon courage.

Jean à Grenoble
Thu, 20 May 2021 18:32:04 GMT

Re: report et format paramétré
?? fake


Thu, 20 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,
J'avoue que j'ai du mal à résoudre mon problème, malgré que j'ai corrigé toutes erreurs syntaxiques et logiques (tel que je comprend), ma requête me ramène que des doublons sur le dernier curseur. Alors j'ai décidé d'élaborer cet état à travers des codes programmes, sauf que je ne connais pas trop les codes indiqués pour cela. J'ai élaboré beaucoup d'états avec Clipper ou DBase 3 il y' environ 20 ans, donc j'ai perdu carrément la main. Est-ce que quelqu'un parmi vous peut mettre à ma disposition un catalogue des codes VFP9 indiqués dans l'élaboration des états ou m'indiquer ou je peux me le procurer?
Je dis merci à vous.
Damonzon.


Thu, 20 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,

> Si tu as besoin du DELETED() dans une requête, tu dois absolument spécifier l'alias : DELETED("crsdet")

J'en doute. Pour autant que je sache, une requête fait un USE AGAIN dans un alias temporaire qui ne sert que pour faire la requête.
On peut utiliser DELETED() s'il n'y a qu'une table dans la requête.
( vaut mieux set deleted ON )
Le DELETED("crsdet") ne teste que l'enregistrement sur lequel on est positionné dans crsdet, et n'a rien à voir avec la requête, qui utilise ses alias pour obtenir un résultat.

[VFP]
set deleted off
create cursor c1 ( v1 i)
insert into c1 values(1)
insert into c1 values(2)
insert into c1 values(3)
go 2
delete

create cursor c2 ( v2 i)
insert into c2 values(1)
insert into c2 values(2)
insert into c2 values(3)
go 3
delete

select v1, v2 from c1, c2;
where !deleted('c1') ;
and !deleted('c2');
into cursor xx readwrite

browse nowait && rien

go 1 in c1
select v1, v2 from c1, c2;
where !deleted('c1') ;
and !deleted('c2');
into cursor yy readwrite

browse nowait && rien

go 1 in c2
select v1, v2 from c1, c2;
where !deleted('c1') ;
and !deleted('c2');
into cursor zz readwrite

browse nowait && tout, même les deleted()
[/VFP]



Tue, 18 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour Jean,
>>autre point : si on a des left outer join c'est que l'on pense que dans la table
à gauche du join il y a des lignes qui n'ont peut-être pas de correspondant dans
la table à droite du join :
- est-ce la cas ?<<

C'est le cas et c'est bien ce que je veux. Je dois dire que j'ai changé de paradigme, maintenant c'est la table BULLDET qui est devenue ma table mère parce qu'elle a avec toute les autres hormis BULLENT une structure de clé identique, ce qui permet d'établir une relation totale. Ce qui m'a amené à construire une requête totalement différente qui semble me donner un curseur vraisemblable, sauf que j'ai une erreur sur une colonne inconnue que je n'arrive pas à détecter depuis hier. Pour NVL(), j'y avais pensé depuis quelque jour, je ne me suis pas retrouvé dans la formulation parce que depuis que j'ai réinstallé mon VFP9, il y'a 5 mois, je n'ai plus le HELP dans le menu. Avez-vous une idée par rapport à cela? J'espère pouvoir détecter la colonne et je vous reviendrai.
Bonne journée.
Damonzon.


Tue, 18 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Le 17/05/2021 à 20:53, Jean à Grenoble a écrit :
> SELECT ...., NVL(bullnet.librub, " ") AS libnet, ...

petite correction, pour éviter un phénomène perturbant de SQL (non, ce n'est pas
un bug !), il faut mettre autant d'espaces dans la chaine que la largeur du
champ ...

Bonne journée
Jean
Tue, 18 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonsoir,

le 'dump' (le resultat) en texte sous la requête ne semble pas correspondre à
une des requêtes : il n'a pas assez de champs ! Peux-tu vérifier ?


autre point : si on a des left outer join c'est que l'on pense que dans la table
à gauche du join il y a des lignes qui n'ont peut-être pas de correspondant dans
la table à droite du join :
- est-ce la cas ?
- si oui, SQL va mettre .NULL. dans les champs correspondant et c'est très
génant. Normalement on supprime ces NULL avec la fonction NVL(). Exemple si le
champ est de type caractère on peut mettre un espace comme dans
SELECT ...., NVL(bullnet.librub, " ") AS libnet, ...

A+

Jean à Grenoble
Mon, 17 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour JC,
Je suis finalement arrivé à créer une requête qui ne me ramène plus de doublons à travers les regroupements. Je suis seulement confronté à un nom de colonne indéfinie ou en double. je continue la recherche. Mais j'ai aussi découvert dans les contributions un exemple de rapport multi bande détail apporté par Nathalie Chacon. je vais l'essayer espérant que ça répondra à mes attentes.
A plus tard.

P.S Si nécessaire, je vais publier la requête en question.




Mon, 17 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
bonjour Jean,
cela me fera énormément plaisir, ci-après mon émail:
mdraba.visualis@gmail.com
très cordialement.


Mon, 17 May 2021 18:32:04 GMT

Re: Report avec une table parent et plusieurs tables enfants (4 ou 5)
Bonjour,
as-tu une @ ? je voudrai t'envoyer un document sur SQL que j'ai fait ... il y a
longtemps !

Bonne journée

Jean à Grenoble
contact ah rho baz j tiret maurice poain effer
Mon, 17 May 2021 18:32:04 GMT

Reproduction totale ou partielle strictement interdite • Propulsé par KitWeb • Hébergement Wan AgainValid XHTML 1.0 Transitional