Crystal report en vb.net - Dataset contenant plusieurs tables

Bonjour tout le monde.
Pour commencer voici les 3 tables utilisées pour remplir le dataset :


Clients | | clt_pres | | prestations |


codeClt | codeClt | codePrestation |
nom | codePrestation| prestation |
adresse | ------------------ -------------------

ville

Bon, l’objectif souhaité c’est d’afficher les coordonnées d’un client (code, nom, adresse, ville) table “Clients” + les codes des prestations accordées à ce client, table “clt_pres” + puis d’afficher en bas du crystal toutes les prastations existantes avec leurs codes, table “prestations”.

ma forme contient une zone de texte contenant le code du client.
j’ai créé un paramètre qui contient la valeur de la zone de texte pour pouvoir afficher seulement les coordonnées du client souhaité.

ce que j’arrive à afficher c’est ce qui suit :

code nom adresse ville codePrestation

101S XXX XXXXX XX 1
101S XXX XXXXX XX 2

codePrestation prestation

1 assistance
2 domiciliation

Mais ce que je veux afficher c’est :
code nom adresse ville codePrestation

101S XXX XXXXX XX 1-2

codePrestation prestation

1 assistance
2 domiciliation
3 audit
4 comptabilité

Le code que j’ai utilisé est le suivant :

Private Sub CrystalReportViewer1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Load
Dim r As New cr_test
Dim s As New ds_test
conn.Open()
adpClt.SelectCommand.Connection = conn
adpClt.SelectCommand.CommandText = "select * from clients"

    adpPres.SelectCommand.Connection = conn
    adpPres.SelectCommand.CommandText = "select * from prestations"

    adpCltPres.SelectCommand.Connection = conn
    adpCltPres.SelectCommand.CommandText = "select * from clt_pres"

    adpClt.Fill(s, "clients")
    adpPres.Fill(s, "prestations")
    adpCltPres.Fill(s, "clt_pres")
    Dim c As New cr_test
    c.SetParameterValue("p1", Par)      ' Par contient la valeur de la zone de 
                                                        ' la zone de texte contenant le code du
                                                        ' client à afficher
    c.SetDataSource(s)                        
    Me.CrystalReportViewer1.ReportSource = c
    conn.Close()

End Sub

si quelqu’un pourrait m’aider à résoudre ce problème, je serai vraiment reconnaissante.

Merci d’avance.

Est ce ke personne n’a une idée pour résoudre ce problème :frowning:

si le problème n’est pas claire, au moins veuillez me le signaler. :confused:

Si tu fais une requete du genre:

adpClt.SelectCommand.CommandText = "select * from client, clt_pres
where client.codeclient=clt_pres.codeclient
order by codeclient"

adpClt.Fill("Datatable")

Ta table contiendra

code nom adresse ville codePrestation

101S XXX XXXXX XX 1
101S XXX XXXXX XX 2

Tu auras ainsi une table que tu pourra bidouiller à ta guise.

En gros tu veux combiner les deux derniers champs non?

dans ce cas


Dim source as datatable
Dim dest as datatable

'recopie des noms de colonne:
for each col as datacolumn in source
dest.columns.add(col)
next

'recopie des champs
int index_codecli = source.columns("codeclient").ordinal
int index_codepres=source.columns("codeprestation").ordinal

dim codecli as String=""
dim newrow as datarow =dest.newrow()


for each row as datarow in source.rows

dim currentcli as String=Ctype(row(index_codecli), System.String)
dim currentpres as String=Ctype(row(index_codepres), System.String)

if codecli.equals(currentcli) Then
'combinaison de champs
newrow.items(index_codepres)=Ctype(newrow(index_codepres), System.String)+"-"+currentpres

Else
if Not codecli.equals("") then 'si ce n'est pas la 1ere fois
dest.rows.add(newrow)
end if
'nouvelle ligne
codecli=currentcli
Dim i as integer=0
for each o as Object in row
newrow.items(i)=o
i=i+1
next
End if
next

j’espere que ça t’aidera

salut popolof :hello:

j’arrive déjà à afficher ceci :

code nom adresse ville codePrestation

101S XXX XXXXX XX 1
101S XXX XXXXX XX 2

donc ce k’il me faut c’est comment grouper les code prestations pour le meme client.

Je ne sais pas si c déjà possible dans un crystal report en VB.net (ke j’ai signalé dans le titre du sujet :wink: )

car le problème se trouve à chaque fois ke je dépasse une table dans le dataset qui est relié au crystal.

j’ai lu ton code, et je comprends le principe ke tu veux me passer, je vais essayer de l’adapter en vb.net, si ça marche c bon sinon, donc j’attendrai d’autres propositions et merci encore une fois. :slight_smile:

peut-être existe t’il une solution en sql dynamique mais c’est pas mon domaine (et je veux pas y toucher)

Sinon tu pourrais faire une sous-requete pour chaque n° de client…

1ere requete:
select * from client;

2eme requete:
select * from codepres where codeclient="valeur du dessus"

et tu ajoute une colonne à la datatable de la 1ere requete représentant la concaténation de tous les résultats de la seconde requete

Pour moi c’est ça le plus propre

pour la concaténation entre 2 colonnes ça je connais mais le fait de concaténer des valeurs d’une meme colonne, c ce ke je connais pas. :neutre:

personne n’a la solution ? :frowning:

y a il au moins une solution du coté sql server pour faire la concaténation?

mon application winform est terminée, et c le seul problème qui reste pour ke je puisse la déployer.

:lol: J’ai une idee que tu pourrais essailler c’est d’utiliser Formula fields
code exemple (Marche) :wink:
{tblCandidats.NoAgent}&{tblCandidats.NoAgent}&{tblCandidats.Statut}

ou quelque chose qui resemblerai a ca
PS ce code ne fonctionne pas mais prend l’idée général :non:
if {tblCandidats.Statut}=0 then

else {tblCandidats.Nom} =1 then

{tblCandidats.Nom}&{tblCandidats.Statut}

j’espere que cela va t’aide si je suis dans le champ
désoler :??: