Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Client/Server  Join 3 Tabele...
 Join 3 Tabele
 
 6/25/2011 12:42:13 PM
User is offlinejohny25
69 posts


Join 3 Tabele
 (N/A)

Salut !

Am 3 tabele pe un server SQL Express.

Tabela 1 :

Tabela : ANGAJATI

NUME_ID

NUME PRENUME

ADRESA

JUDET

1

Nume Prenume 1

Adresa 1

CT

2

Nume Prenume 2

Adresa 2

BV

3

Nume Prenume 3

Adresa 3

CJ

4

Nume Prenume 4

Adresa 4

TM

5

Nume Prenume 5

Adresa 5

AR

 

Tabela 2 :

Tabela : VINZARI

NUME_ID

PRODUS_ID

NUME_PRODUS

CANTITATE

PRET

VALOARE_TOTALA

1

101

Memorie

2.00

100.00

200.00

2

102

HDD

1.00

350.00

350.00

3

103

Mouse

5.00

55.00

275.00

4

104

Card SD

3.00

65.00

195.00

5

105

Camera Foto

2.00

800.00

1600.00

Tabela 3 :

Tabela : INCASARI

NUME_ID

PRODUS_ID

VALOARE_TOTALA

SUMA_INCASATA

5

105

1600.00

300.00

5

105

1600.00

200.00

Din cele trei tabele vreau sa rezulte a patra tabela cu o comanda SELECT direct de pe server.

Tabela 4 :

Tabela : GENERATA DIN CELE TREI TABELE DE MAI SUS

NUME_ID

NUME PRENUME

ADRESA

JUDET

NUME_PRODUS

VALOARE_TOTALA

SUMA_INCASATA

DIFERENTA

1

Nume Prenume 1

Adresa 1

CT

Memorie

200.00

0.00

200.00

2

Nume Prenume 2

Adresa 2

BV

HDD

350.00

0.00

350.00

3

Nume Prenume 3

Adresa 3

CJ

Mouse

275.00

0.00

275.00

4

Nume Prenume 4

Adresa 4

TM

Card SD

195.00

0.00

195.00

5

Nume Prenume 5

Adresa 5

AR

Camera Foto

1600.00

500.00

1100.00

Va rog sa-mi spuneti sintaxa exacta a comenzii SELECT pt ca eu nu am reusit sa o gasesc desi am incercat cu mai multe tipuri de JOIN si sub nici o forma nu am reusit sa calculez cu sum(suma_incasata) suma incasata din tabela INCASARI pt a fi gasita in tabela rezultata.

Incerc sa uploadez si un fisier ZIP cu cele 4 tabele pe forum.

Va multumesc !

Exemplu Tabele.zip 
 6/26/2011 9:35:44 AM
User is offlineMarian Dobre
398 posts
3rd


Re: Join 3 Tabele
 (N/A)

Observatii:

1)      Fiecare tabela este bine sa aiba un ID propriu. La tine ar trebui sa fie Angajat_ID, Vanzare_ID, Incasare_ID ;

2)      ID-ul se refera la o inregistrare a tabelei si nu la un atribut al sau. De exemplu Angajat_ID si nu NUME_ID ;

3)      Un produs are o denumire si nu un nume. In consecinta ar trebui sa ai Denumire_produs si nu NUME_PRODUS ;

4)      Din exemplul tau rezulta ca un angajate vinde numai un produs. (Nume Prenume 1 vinde numai Memorii, Nume Prenume 2 vinde numai HDD-uri, etc.). Daca este asa ar fi trebuit ca primele doua tabele sa se transforme intr-o singura tabela. Ce se intampla in cazul schimbarii pretului unui produs si nu s-a incasat toata vanzarea la pretul vechi ? Nu cumva trebuie sa apara produsul la ambele preturi ?;

 Uite o solutie in VFP

 Close Tables All

 Select A.Nume_Id, A.Nume_prenume, A.Adresa, A.Judet, V.Produs_Id , V.Nume_produs, ;

            V.Cantitate, V.Pret, V.Valoare_Totala ;

            FROM Angajati A INNER Join Vanzari V ;

            ON A.Nume_Id = V.Nume_Id  ;

            INTO Cursor crsVanzareAngajati


 Select I.Nume_Id, I.Produs_Id, Sum(I.Valoare_incasata) As Total_Incasare ;

            FROM Incasari I ;

            GROUP By I.Nume_Id, I.Produs_Id ;

            INTO Cursor crsIncasari

 

Select C.Nume_Id, C.Nume_prenume, C.Nume_produs, C.Valoare_Totala, CI.Total_Incasare, ;

            C.Valoare_Totala - CI.Total_Incasare As Val_Neincasata ;

            FROM crsVanzareAngajati C ;

            LEFT Join crsIncasari CI On C.Nume_Id = CI.Nume_Id And C.Produs_Id = CI.Produs_Id ;

            INTO Cursor crsIncasareVanzari

 


Orice putere omeneasca este un compus de rabdare si de timp. Balzac
 6/26/2011 2:12:14 PM
User is offlinejohny25
69 posts


Re: Join 3 Tabele
 (N/A)

In VFP am reusit sa fac tabela nr 4 cu un query.Prima data am descarcat de pe server datele  din cele 3 tabele,iar apoi am executat query pt. a genera tabela nr 4.

Eu am nevoie de sintaxa SQL pt. a lua datele direct de pe server pt a fi mai rapid.

Intr-adevar in tabela mea am denumire produs si nu un nume produs (am scris gresit).

Tabela VINZARI este data doar ca exemplu.Nu inseamna ca un anumit angajat vinde numai un anumit produs.Fiecare angajat poate vinde orice produs.

Problema mea este sa calculez din tabela INCASARI suma incasata si diferenta de plata pt fiecare produs vindut.

Totusi doresc sa generez tabela nr 4 doar prin o singura comanda SQL SELECT direct de pe server.

Va rog sa ma ajutati daca se poate.

Va multumesc !

 6/26/2011 3:25:03 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Join 3 Tabele
 (N/A)
Select a.nume_id, a.nume_prenume, a.adresa, a.judet, v.produs.id, v.nume_produs, v.cantitate, v.valoare_totala, i.suma_incasata, v.valoare_totala-i.suma_incasata as diferenta
from angajati a left join
(select nume_id, produs_id, nume_produs, sum(cantitate) as cantitate, sum(cantitate*pret) as valoare_totala from vanzari group by nume_id, produs_id, nume_produs)
on a.nume_id=v.nume_id
left join
(select nume_id, produs_id, sum(suma_incasata) as suma_incasata from incasari group by nume_id, produs_id) i
on v.nume_id=i.nume_id and v.produs_id=i.produs_id

Subscriu la observatiile facute de Marian.
In plus
- in tabela vanzari nu are ce cauta nume_produs, iar valoarea_totala e informatie redundanta: e egala cu pret*cantitate.
- in tabela incasari nu are ce cauta valoarea totala
- iti lipseste o tabela cu articole
- ce faci daca in situatia vanzari.cantitate*vanzari.pret <> vanzari.valoare_totala <> incasari.valoare_totala? ce valoare iei de buna?
- daca la incasare nu se specifica pentru ce produs se face plata - se mai intampla asta-  marfa figureaza neincasata?



Daniel Buduru
 7/4/2011 2:20:49 PM
User is offlinejohny25
69 posts


Re: Join 3 Tabele
 (N/A)
Imi pare rau dar NU MERGE. Am incercat codul domnului Daniel Buduru exact cum este scris mai sus si primesc erori : Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'on'. Msg 156, Level 15, State 1, Line 7 Incorrect syntax near the keyword 'on'. Am incercat sa schimb putin codul acela cu urmatorul : Select a.nume_id, a.nume_prenume, a.adresa, a.judet, v.produs.id, v.nume_produs, v.cantitate, v.valoare_totala, i.suma_incasata, v.valoare_totala-i.suma_incasata as diferenta from angajati a left join (select nume_id, produs_id, nume_produs, sum(cantitate) as cantitate, sum(cantitate*pret) as valoare_totala from vinzari group by nume_id, produs_id, nume_produs) on (a.nume_id=v.nume_id ) left join (select nume_id, produs_id, sum(suma_incasata) as suma_incasata from incasari group by nume_id, produs_id) i on (v.nume_id=i.nume_id and v.produs_id=i.produs_id) si din nou primesc erori : Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'on'. Msg 156, Level 15, State 1, Line 7 Incorrect syntax near the keyword 'on'. Precizez ca am executat comanda SELECT in SQL Server Management Studio intr-un query. Ce pot sa fac pt a obtine a 4-a tabela ca rezultat? Va multumesc !
 7/4/2011 3:13:36 PM
User is offlineDoru Constantin
321 posts
3rd




Re: Join 3 Tabele
 (N/A)
...
(select nume_id, produs_id, nume_produs, sum(cantitate) as cantitate, sum(cantitate*pret) as valoare_totala from vanzari v group by nume_id, produs_id, nume_produs)
...

(v dupa vanzari)
 7/4/2011 4:20:03 PM
User is offlinejohny25
69 posts


Re: Join 3 Tabele
 (N/A)
Tot nu merge. Acum primesc eroarile : Msg 156, Level 15, State 1, Line 4 Incorrect syntax near the keyword 'on'. Msg 102, Level 15, State 1, Line 6 Incorrect syntax near 'i'. La codul corectat de domnul Doru Constantin : Select a.nume_id, a.nume_prenume, a.adresa, a.judet, v.produs.id, v.nume_produs, v.cantitate, v.valoare_totala, i.suma_incasata, v.valoare_totala-i.suma_incasata as diferenta from angajati a left join (select nume_id, produs_id, nume_produs, sum(cantitate) as cantitate, sum(cantitate*pret) as valoare_totala from vanzari v group by nume_id, produs_id, nume_produs) on a.nume_id=v.nume_id left join (select nume_id, produs_id, sum(suma_incasata) as suma_incasata from incasari group by nume_id, produs_id) i on v.nume_id=i.nume_id and v.produs_id=i.produs_id
 7/4/2011 5:22:35 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Join 3 Tabele
 (N/A)
Select a.nume_id, a.nume_prenume, a.adresa, a.judet, v.produs.id, v.nume_produs, v.cantitate, v.valoare_totala, i.suma_incasata, v.valoare_totala-i.suma_incasata as diferenta
from angajati a left join
(select nume_id, produs_id, nume_produs, sum(cantitate) as cantitate, sum(cantitate*pret) as valoare_totala from vanzari group by nume_id, produs_id, nume_produs) v
on a.nume_id=v.nume_id
left join
(select nume_id, produs_id, sum(suma_incasata) as suma_incasata from incasari group by nume_id, produs_id) i
on v.nume_id=i.nume_id and v.produs_id=i.produs_id

Codul pe care il postez este intotdeauna scris in browser, si deci neverificat. Prin urmare, pot fi erori de tastare sau pur si simplu scapari.
Ar trebui sa poti corecta o astfel de eroare.



Daniel Buduru
 7/4/2011 6:17:55 PM
User is offlineDoru Constantin
321 posts
3rd




Re: Join 3 Tabele
 (N/A)
...
(select nume_id, produs_id, sum(suma_incasata) as suma_incasata from incasari i group by nume_id, produs_id)
...

 7/4/2011 6:42:36 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Join 3 Tabele
 (N/A)
Aliasurile v si i sunt atribuite celor doua subquery, si nu tabelelor vanzari si incasari.


Daniel Buduru
 7/4/2011 7:11:42 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Join 3 Tabele
 (N/A)
Si tot mai era o eroare:  v.produs.id in loc de v.produs_id

Select a.nume_id, a.nume_prenume, a.adresa, a.judet, v.produs_id, v.nume_produs, v.cantitate, v.valoare_totala, i.suma_incasata, v.valoare_totala-i.suma_incasata as diferenta
from angajati a left join
(select nume_id, produs_id, nume_produs, sum(cantitate) as cantitate, sum(cantitate*pret) as valoare_totala from vanzari group by nume_id, produs_id, nume_produs) v
on a.nume_id=v.nume_id
left join
(select nume_id, produs_id, sum(suma_incasata) as suma_incasata from incasari group by nume_id, produs_id) i
on v.nume_id=i.nume_id and v.produs_id=i.produs_id

 

Daniel Buduru
 7/4/2011 10:31:05 PM
User is offlinejohny25
69 posts


Re: Join 3 Tabele
 (N/A) Modified By johny25  on 7/5/2011 12:51:40 AM)
Va multumesc foarte mult tuturor pentru raspunsuri! Acum merge bine.
 7/5/2011 1:14:45 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Join 3 Tabele
 (N/A)
1. VFP accepta 8192 caractere intr-o linie de comanda, asa ca ar trebui sa-ti accepte comanda.
Pentru comenzi mai mari, solutia este de a imparti comanda in siruri mai mici:
comanda=lcSql1+lcSql2+lcSql3
Repet, cu o comanda de 974 caractere trebuie sa mearga. Probabil ca ai pus comanda intr-o variabila exact asa cum am postat-o (sintaxa T-SQL), si nu o accepta.
Incearca asa

TEXT TO comanda NOSHOW
Select a.nume_id, a.nume_prenume, a.adresa, a.judet, v.produs_id, v.nume_produs, v.cantitate, v.valoare_totala, i.suma_incasata, v.valoare_totala-i.suma_incasata as diferenta
from angajati a left join
(select nume_id, produs_id, nume_produs, sum(cantitate) as cantitate, sum(cantitate*pret) as valoare_totala from vanzari group by nume_id, produs_id, nume_produs) v
on a.nume_id=v.nume_id
left join
(select nume_id, produs_id, sum(suma_incasata) as suma_incasata from incasari group by nume_id, produs_id) i
on v.nume_id=i.nume_id and v.produs_id=i.produs_id
ENDTEXT

IF SQLEXEC(SQL_Conn_Handle,comanda,"test")
<1
 aerror(ae)
? ae[2]
ENDIF

2. Nu trebuie sa faci o tabela cu rezultatul interogarii. Faci un view in baza de date cu definitia pe care o ai deja, si deschizi acest view ori de cate ori ai nevoie de aceste date.
Nu tine date calculate pe un server sql daca nu vrei sa ai probleme mai tarziu.


Daniel Buduru
 7/5/2011 10:52:13 AM
User is offlinejohny25
69 posts


Re: Join 3 Tabele
 (N/A)
Intr-adevar eu am gresit comanda.Am rezolvat totusi problema. Sincer nu imi place sa lucrez cu REMOTE VIEW si nici nu ma pricep foarte bine. Am ales sa imi generez tabela a 4-a de fiecare data cind am nevoie in VFP. Domnule Daniel Buduru va multumesc foarte mult pentru ajutorul dat !
 7/5/2011 11:29:05 AM
User is offlineDaniel Buduru
2335 posts
1st




Re: Join 3 Tabele
 (N/A) Modified By Daniel Buduru  on 7/5/2011 11:44:43 AM)
Nu lucrezi cu remote view. Creezi un view pe server, din care poti face apoi select.
Ruleaza asta in SSMS:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE VIEW [dbo].[v_vanzari_incasari]
AS
SELECT     a.nume_id, a.nume_prenume, a.adresa, a.judet, v.produs_id, v.nume_produs, v.cantitate, v.valoare_totala, i.suma_incasata,
                      v.valoare_totala - ISNULL(i.suma_incasata,0) AS diferenta
FROM         dbo.Angajati AS a LEFT OUTER JOIN
                          (SELECT     nume_id, produs_id, nume_produs, SUM(cantitate) AS cantitate, SUM(cantitate * pret) AS valoare_totala
                            FROM          dbo.Vanzari
                            GROUP BY nume_id, produs_id, nume_produs) AS v ON a.nume_id = v.nume_id LEFT OUTER JOIN
                          (SELECT     nume_id, produs_id, SUM(suma_incasata) AS suma_incasata
                            FROM          dbo.incasari
                            GROUP BY nume_id, produs_id) AS i ON v.nume_id = i.nume_id AND v.produs_id = i.produs_id

GO


Apoi executa
Select * from v_vanzari_incasari
Nu ai nevoie sa intretii o tabela pentru a avea la dispozitie datele.

Serverul SQL permite mai mult decat baza de date vfp.

Modifica tabela vanzari, selecteaza campul valoare_totala, apoi mergi la proprietati, in fereastra de jos, deschide "Computed Column Specification", apoi, la "Formula", scrie [cantitate]*[pret]
Vei obtine coloana valoare_totala calculata ca produsul dintre cantitate si pret. Serverul sql se va ocupa de popularea acestei coloane ori de cate ori o adresezi intr-un select, fara a fi nevoie sa o populezi in trigger.


Later Edit:
Mi-a mai scapat ceva, pentru ca diferenta sa nu fie null in cazul in care nu exista nici o incasare, expresia trebuie modificata astfel:
v.valoare_totala - ISNULL(i.suma_incasata,0) AS diferenta in loc de v.valoare_totala - i.suma_incasata AS diferenta


Daniel Buduru
  Visual FoxPro  Client/Server  Join 3 Tabele...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement