--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Rozwiazanie podobnego problemu (access 97):
> Mam tabele [zlecenia] i tabele [projektanci] powiazane relacja
> jeden-do-wielu, czyli do jednego zlecenia moze byc przypisanych wielu
> projektantow.
co z porz?dna firma. ja bym się tu spodziewał relacji wiele do wielu ;)
> Teraz potrzebna mi jest kwerenda, ktora w jednym rekordzie zapisywalaby
np.
> 3 projektantów.
> Obrazowo:
> nie ma byc:
> Id zlecenia | Projektant
> 1 | P1
> 1 | P2
> 1 | P3
OK - to mamy. Niech to sie nazywa tabela1
> tylko:
> Id zlecenia | Projektant
> 1 | P1,P2,P3
a to chcemy miec
> lub
> Id zlecenia | Projektant1 | Projektant2 | Projektant3
> 1 | P1 | P2 | P3
a tego nie chemy. zreszta to tylko opcja ;)
> Czy jest to mozliwe? Jesli tak, to jak to zrobic?
> Dziekuje z gory
> Senga
Nie umiem tego zrobić 1 kwerenda - sql nie ma funkcji agreguj?cej tekst :(
wiec chyba sie nie da???
ale dwoma to będzie jako? tak:
SELECT [Id zlecenia], space(30) AS projektant
INTO zleconka
FROM tabela1
GROUP BY [Id zlecenia];
UPDATE tabela1
INNER JOIN zleconka ON zleconka.[Id zlecenia] = tabela1.[Id zlecenia]
SET zleconka.projektant = ltrim(zleconka.projektant & "," &
tabela1.projektant);
Bartek
(...)
| Nie umiem tego zrobić 1 kwerenda - sql nie ma funkcji agreguj?cej tekst :(
| wiec chyba sie nie da???
| ale dwoma to będzie jako? tak:
|
| SELECT [Id zlecenia], space(30) AS projektant
| INTO zleconka
| FROM tabela1
| GROUP BY [Id zlecenia];
|
| UPDATE tabela1
| INNER JOIN zleconka ON zleconka.[Id zlecenia] = tabela1.[Id zlecenia]
| SET zleconka.projektant = ltrim(zleconka.projektant & "," &
| tabela1.projektant);
|
Niewątpliwie to rozwiązanie jest najszybsze.
Jego jedna wada, że wymaga tabeli pomocniczej lub pomocniczego pola w tabeli
"jeden"
Ale możemy sobie napisać funkcję:
Function DSumText(sField As String, _
sTable As String, _
Optional sWhere As String, _
Optional sSep As String = ",") As Variant
Dim rec As Recordset
Dim strSQL As String
Dim kon As String
strSQL = "Select " & sField & " FROM " & sTable
If Len(sWhere) > 0 Then
strSQL = strSQL & " WHERE " & sWhere
End If
On Error GoTo err_exit
Set rec = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
With rec
Do Until .EOF
kon = kon & sSep & .Fields(0).Value
.MoveNext
Loop
.Close
End With
kon = Mid(kon, Len(sSep) + 1)
DSumText = kon
Exit Function
err_exit:
End Function
Kwerenda:
Select NrIDpracy,
First(DSumText("Autorzy", "tbAutorzy", "NrIDPracy=" & [NrIdPracy]))
From Tabela
Group By NrIDPracy
albo
(dwie tabele)
Select
Zlecenia.*,
DSumText("Projektant", "Projektanci", "IDZlecenia=" & [IDZlecenia), "-")
From Zlecenia
KN
poprawki:
| Kwerenda:
|
| Select NrIDpracy,
| First(DSumText("Autorzy", "tbAutorzy", "NrIDPracy=" & [NrIdPracy]))
| From tbAutorzy <<<
| Group By NrIDPracy
|
Ale można pominąć First(), skoro jedyne pole przekazywane do wnętrza funkcji
DSumText jest wymienione na liście GroupBy
czyli:
Select NrIDpracy,
DSumText("Autorzy", "tbAutorzy", "NrIDPracy=" & [NrIdPracy])
From tbAutorzy
Group By NrIDPracy
| albo
| (dwie tabele)
|
| Select
| Zlecenia.*,
| DSumText("Projektant", "Projektanci", "IDZlecenia=" & [IDZlecenia], "-")
| From Zlecenia
|
Jak ktoś zapragnie warunek WHERE skonstruować na kluczu tekstowym, to
oczywiście należy pamiętać o apostrofach:
DSumText("Projektant", "Projektanci", "ID='" & [ID] & "'", "/ ")
Ze względu na sposób tworzenia wyrażenia SQL rekordsetu, można nawet
przekazać skomplikowane wyrażenia:
DSumText(
"[pole1] & " " & [pole2]",
"tabela1",
"pole3=4 ORDER BY pole4 DESC")
a nawet sprzężenia kilku tabel w drugim argumencie :-)
"tab1 INNER JOIN tab2 On tab1.ID=tab2.ID"
;-)
ale może bez przesady ...
KN