Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

"sumowanie" tekstu w wybr. rekordach pola

87 views
Skip to first unread message

mbra...@bsk.vectranet.pl

unread,
Feb 21, 2002, 3:52:35 PM2/21/02
to
W jaki sposób, przy użyciu kwerendy a może jakieś konstrukcji kodu (proszę o
podanie tej konstrukcji) można by dodać wybrane rekordy o zawartości tekstowej
w jednym polu grupując je ze względu na jednakową zawartość w innym polu tej
samej tabeli? Np. w uproszczeniu: tabela o dwóch polach: NrIDpracy i Autorzy,
należy dodać do siebie nazwiska autorów tej samej pracy czyli dodawanie tekstu
rozmieszczonego nie w polach(poziomo) a w wybranych rekordach(pionowo).

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Bartek

unread,
Feb 22, 2002, 12:35:18 PM2/22/02
to

Użytkownik <mbra...@bsk.vectranet.pl> napisał w wiadomości
news:1f72.000017...@newsgate.onet.pl...

> W jaki sposób, przy użyciu kwerendy a może jakieś konstrukcji kodu (proszę
o
> podanie tej konstrukcji) można by dodać wybrane rekordy o zawartości
tekstowej
> w jednym polu grupując je ze względu na jednakową zawartość w innym polu
tej
> samej tabeli? Np. w uproszczeniu: tabela o dwóch polach: NrIDpracy i
Autorzy,
> należy dodać do siebie nazwiska autorów tej samej pracy czyli dodawanie
tekstu
> rozmieszczonego nie w polach(poziomo) a w wybranych rekordach(pionowo).

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


Krzysztof Naworyta

unread,
Feb 22, 2002, 2:04:16 PM2/22/02
to

Użytkownik "Bartek" <nop...@nospam.pl> napisał w wiadomości
news:a55vkr$jtq$1...@news.tpi.pl...

|
| > W jaki sposób, przy użyciu kwerendy a może jakieś konstrukcji kodu
(proszę
| o
| > podanie tej konstrukcji) można by dodać wybrane rekordy o zawartości
| tekstowej
| > w jednym polu grupując je ze względu na jednakową zawartość w innym polu
| tej
| > samej tabeli? Np. w uproszczeniu: tabela o dwóch polach: NrIDpracy i
| Autorzy,
| > należy dodać do siebie nazwiska autorów tej samej pracy czyli dodawanie
| tekstu
| > rozmieszczonego nie w polach(poziomo) a w wybranych rekordach(pionowo).
|
| 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.

(...)


| 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


Krzysztof Naworyta

unread,
Feb 22, 2002, 2:24:56 PM2/22/02
to

Użytkownik "Krzysztof Naworyta" <k.naw...@datacomp.com.pl> napisał w
wiadomości news:a564b5$bnf$1...@news.onet.pl...
|

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


elf...@gmail.com

unread,
Oct 15, 2014, 9:26:47 AM10/15/14
to
Witam Serdecznie
Juz od 2 dni borykam się z problemem "zliczania" pól tekstowych w jedno pole po ID.
Kwerenda zwraca mi puste pola.
Bardzo proszę o pomoc.

LeszekN

unread,
Oct 15, 2014, 1:35:06 PM10/15/14
to
> Juz od 2 dni borykam się z problemem "zliczania" pól tekstowych w jedno pole po
> ID.
> Kwerenda zwraca mi puste pola.

Witam
Nie bardzo wiem dla czego ci nie działa bo nic konkretnego nie napisałeś.

ja robie to tak
dodaje moduł, i w nim piszemy Funkcje

Function DSumText(sField As String, _
sTable As String, _
Optional sWhere As String, _
Optional sSep As String = ",") As Variant

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
With CurrentDb.OpenRecordset(strSQL, 4)
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:
Set DSumText = Err

End Function
Oczywiście funkcja pochodzi od Naszego Guru KN'a :)

potem w kwerendzie
SELECT tblFaktura.IDfaktura, DSumText("nrDokumentu","tblDokument","IDFaktury=" & [IDfaktury]) AS Wyr1
FROM tblFaktura INNER JOIN tblDokument ON tblFaktura.IDfaktura = tblDokument.IDFaktury
GROUP BY tblFaktura.IDfaktura, DSumText("nrDokumentu","tblDokument","IDFaktury=" & [IDfaktury]);

i tyle to działa
pokaz twoj kod cos wymyslimy

Leszek

LeszekN

unread,
Oct 15, 2014, 4:04:40 PM10/15/14
to
takie małe sprostowanie
wczesniejszy przykład był dla dwóch tabel
A tu masz przyklad kwerendy dla jednej tabeli

SELECT tblDokument_Pozycje.IDdokumentu, DSumText("idTowaru","tblDokument_pozycje","IDDokumentu=" & [IDDokumentu]) AS Wyr1
FROM tblDokument_Pozycje
GROUP BY tblDokument_Pozycje.IDdokumentu, DSumText("idTowaru","tblDokument_pozycje","IDDokumentu=" & [IDDokumentu]);

I jeszcze mała pomoc
DSumText("KolumnaTabeliDoZsumowania","ZjakiejTabeliSumowac","tutajOkreslaszktoreRekordyMaSumowacFunkcja")

pozdrawiam
Leszek

elf...@gmail.com

unread,
Oct 16, 2014, 2:06:30 AM10/16/14
to
W dniu czwartek, 21 lutego 2002 21:55:10 UTC+1 użytkownik mbra...@bsk.vectranet.pl napisał:
Dziękuę serdecznie za odpowiedz.
tak wygląda mój kod:

SELECT dzglowna_tylko_0_tabela.dzglowna0, DSumText("podmSingle0","dzglowna_tylko_0_tabela","dzglowna0=" & [dzglowna0]) AS Wyr1
FROM dzglowna_tylko_0_tabela
GROUP BY dzglowna_tylko_0_tabela.dzglowna0, DSumText("podmSingle0","dzglowna_tylko_0_tabela","dzglowna0=" & [dzglowna0]);


Na wszelki wypadek założyłem nową bazę .accdb
W niej mam tylko tabelę o nazwie: dzglowna_tylko_0_tabela
oraz założyłem nowy moduł o nazwie: DSumTextModul w którym jest wprowadzony poniższa funkcja (skopiowana z Twojego posta).

Function DSumText(sField As String, _
sTable As String, _
Optional sWhere As String, _
Optional sSep As String = ",") As Variant

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
With CurrentDb.OpenRecordset(strSQL, 4)
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:
Set DSumText = Err

End Function

Tym razem zamiast zwracać mi puste pola podczas uruchamiania kwerendy otrzymuje komunikat: Nieodpowiedni typ danych w wyrażeniu kryterium.

Jakiś pomysł?
A może mógłbyś podesłać mi przykładową bazę gdzie działa owa funkcja wtedy może udało by mi się zmodyfikować pod własne potrzeby?

elf...@gmail.com

unread,
Oct 16, 2014, 2:10:42 AM10/16/14
to
W dniu czwartek, 21 lutego 2002 21:55:10 UTC+1 użytkownik mbra...@bsk.vectranet.pl napisał:
W tabeli mam tylko 2 pola:
dzglowna0
podmSingle0
oba typy danych to text.

elf...@gmail.com

unread,
Oct 16, 2014, 2:27:14 AM10/16/14
to
W dniu czwartek, 21 lutego 2002 21:55:10 UTC+1 użytkownik mbra...@bsk.vectranet.pl napisał:
poszło.
jak zmieniłem pole ID na cyfrę to program działa jak ta lala.
czy jest możliwość aby pole ID było tekstem?
posiadam pola gdzie ID ma wartość 92/1 po którym muszę zliczyć dzglowna0

Zbigniew Bratko

unread,
Oct 16, 2014, 4:05:25 AM10/16/14
to
W dniu 16-10-2014 08:27, elf...@gmail.com pisze:

[...]
>
> poszło.
> jak zmieniłem pole ID na cyfrę to program działa jak ta lala.
> czy jest możliwość aby pole ID było tekstem?
> posiadam pola gdzie ID ma wartość 92/1 po którym muszę zliczyć dzglowna0
>

A coś takiego:

zamień w całym SQL-u wystąpienia:
"dzglowna0=" & [dzglowna0]
na
"dzglowna0='" & [dzglowna0] &"'"


innymi słowami:
ciąg znaków musisz przekazać w apostrofach

np. "'" & [TwojePole] & "'"

--
Pozdrowienia
BraZby
www.faq.accdb.pl/
www.acc97.accdb.pl/

elf...@gmail.com

unread,
Oct 16, 2014, 4:26:06 AM10/16/14
to
W dniu czwartek, 21 lutego 2002 21:55:10 UTC+1 użytkownik mbra...@bsk.vectranet.pl napisał:
nie idzie. po zmianie otrzymuje komunikat:
Nieodpowiedni typ danych w wyrażeniu kryterium.

Kwerenda nie chce sie uruchomic

Zbigniew Bratko

unread,
Oct 16, 2014, 6:50:49 AM10/16/14
to
W dniu 16-10-2014 10:26, elf...@gmail.com pisze:
No to spróbuj czegoś takiego:

SELECT dzglowna_tylko_0_tabela.dzglowna0,
DSumText("podmSingle0","dzglowna_tylko_0_tabela","dzglowna0='" &
[dzglowna0] & "'") AS Wyr1
FROM dzglowna_tylko_0_tabela
GROUP BY dzglowna_tylko_0_tabela.dzglowna0,
DSumText("podmSingle0","dzglowna_tylko_0_tabela","dzglowna0='" &
[dzglowna0] & "'");

Pole w tabeli [dzglowna0] jest oczywiście typu Text.

SOA#1 ;-)

elf...@gmail.com

unread,
Oct 16, 2014, 7:01:58 AM10/16/14
to
W dniu czwartek, 21 lutego 2002 21:55:10 UTC+1 użytkownik mbra...@bsk.vectranet.pl napisał:
nadal nie dziala
wlasnie w takiej formie jak wkleiles probowalem wczesniej

elf...@gmail.com

unread,
Oct 16, 2014, 7:13:02 AM10/16/14
to
W dniu czwartek, 21 lutego 2002 21:55:10 UTC+1 użytkownik mbra...@bsk.vectranet.pl napisał:
chyba jednak, działa, przepraszam jeszcze testuje. dam znac

elf...@gmail.com

unread,
Oct 16, 2014, 8:27:56 AM10/16/14
to
W dniu czwartek, 21 lutego 2002 21:55:10 UTC+1 użytkownik mbra...@bsk.vectranet.pl napisał:
Ok działa.
Bardzo dziękuję za pomoc.
Jak trochę się ogarnę to jeszcze muszę przeanalizować gdzie był mój błąd, że nie działało wcześniej.
Pozdrawiam
Sebastian B.
0 new messages