Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[Access 2010] Operacje na Recordset, uaktualnienie tabeli

Idź do strony Poprzedni  1, 2, 3, 4, 5  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Bazy danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Czw Sty 03, 2019 11:52 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Witam ponownie i ponownie prośba o pomoc. O ile kwerenda aktualizująca i dołączająca sprawdza się świetnie przy pojedynczych rekordach, to mam pytanie: czy istnieje możliwość zaktualizowania i dołączenia za pomocą tych kwerend kilku rekordów jednocześnie w tabeli, której źródłem pola jest pole innej tabeli??? I kolejne pytanie: jeżeli typy danych w polach tabel się różnią (tekst i liczba), to czy nie da się tego jakoś obejść, na zasadzie wyciagnięcia interesujących mnie danych, np.: pole.Column(2)?
W załączeniu przykład dotyczy tabel T_OpOcen i T_OpOcen_temp. Do T_OpOcen_temp importowane są dane z Excel, m.in. do pola Pesel, które jest polem tekstowym. Na podstawie tych danych chciałbym zaktualizować tabelę T_OpOcen z zachowaniem zasady, by dla wspólnego Pesel (tekst) i ID_Osoby (liczba) w tych tabelach:
- aktualizowało tylko te rekordy, dla których rok jest taki sam, ale oceny są różne
- dodawało rekordy, w zależności od wartości pola rok, których nie ma w T_OpOcen, a które znajdują się w zaimportowanych danych w T_OpOcen_temp.
Dla rozjaśnienia w tabeli T_OpOcen_temp zaznaczyłem rekordy, które powyżej opisałem.
Z góry dziękuję za pomoc :)



Test.7z
 Opis:

Pobierz
 Nazwa pliku:  Test.7z
 Wielkość pliku:  24.63 KB
 Pobierano:  15 raz(y)


_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
andie



Dołączył: 17 Lut 2017
Posty: 5

PostWysłany: Pon Sty 07, 2019 5:52 pm      Temat postu: Odpowiedz z cytatem Pisownia

Ponieważ Karolina chyba jeszcze świętuje, postaram się ją zastąpić ;-)

elfface, coś Ty tutaj trochę ściemniasz ;-) Typy w tabelach są zgodne, tylko że PESEL masz zapisany w tabeli T_Osoby (pole: Osoby_Pesel, typ danych tekst), a w tabeli T_OpOcen w polu ID_Osoby masz tylko odnośnik do tabeli T_Osoby - dlatego też wyświetla Ci się tam PESEL.

Mając to na uwadze, oczekiwane kwerendy mogłyby wyglądać tak:

UPDATE
Kod:
UPDATE T_OpOcen AS oc LEFT JOIN (T_Osoby AS os LEFT JOIN T_OpOcen_temp AS oct ON oct.Pesel = os.Osoby_Pesel) ON os.ID_Osoby = oc.ID_Osoby SET oc.opOcen_ocena = oct.ocena
WHERE oc.Opocen_rok = oct.rok and oc.opOcen_ocena <> oct.ocena;


INSERT INTO
Kod:
INSERT INTO T_OpOcen ( id_osoby, opOcen_rok, opOcen_ocena )
SELECT os.id_osoby, oct.rok, oct.ocena
FROM T_OpOcen_temp AS oct LEFT JOIN T_Osoby AS os ON oct.Pesel = os.Osoby_Pesel
WHERE NOT EXISTS (SElECT 1 FROM T_OpOcen as oc WHERE oc.id_osoby = os.id_osoby
AND oc.OpOcen_Rok = oct.rok);



andie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface_X
Gość





PostWysłany: Sro Sty 09, 2019 7:23 pm      Temat postu: Odpowiedz z cytatem Pisownia

Działa :) Serdeczne dzięki za pomoc, sam bym tego nie zmajstrował :) Pozdrawiam.
Powrót do góry
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7905

PostWysłany: Czw Sty 10, 2019 8:54 pm      Temat postu: Odpowiedz z cytatem Pisownia

Do andie
Dzięki za zastępstwo.
------------------------------------
Elfface napisał:
Cytat:
Do T_OpOcen_temp importowane są dane z Excel, m.in. do pola Pesel, które jest polem tekstowym
W bazie Acc są odnośniki i wymagania na polach, co jest, że tak powiem w Excelu nie wiemy.
I tak na przykład dla danych jak w moim załączniku mam rekord z Excela z peselem 44444444447 w tabeli T_OpOcen_temp.
Takiego pesela nie ma w T_Osoby w załączniku.
Nic Elfface nie napisał, albo ja tego nie widzę, że najpierw trzeba uzupełniać T_Osoby.
Skutkiem wykonania kwerendy kw_andie_insert (andiego) jest komunikat jak na obrazku z powodu LEFT JOIN zamiast INNER…
W 1-szej kwerendzie też bym ten INNER.
?



Test_2_andie.rar
 Opis:

Pobierz
 Nazwa pliku:  Test_2_andie.rar
 Wielkość pliku:  27.81 KB
 Pobierano:  17 raz(y)


LEFT_JOIN.png
 Opis:

Pobierz
 Nazwa pliku:  LEFT_JOIN.png
 Wielkość pliku:  17.74 KB
 Pobierano:  16 raz(y)

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Pon Sty 14, 2019 3:16 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dzień dobry. karolinavb i andie bardzo dziękuję za pomoc :) Zasada działania powinna być następująca:
1. Uzupełnienie danych w T_Osoby na podstawie zaimportowanych danych z Excel do T_Osoby_temp.
2. Uzupełnienie danych w T_OpOcen na podstawie zaimportowanych danych z Excel do T_OpOcen_temp.
Dokładnie w tej kolejności, ale rzeczywiście, w importowanym pliku Excel może się pojawić jakis "lewy" Pesel.
Teraz z kolei zastanawiam się co zrobić w takim przypadku, a konkretnie w jaki sposób powiadomić użytkownika, że taka sytuacja ma miejsce, wskazując ten konkretny PESEL? Oczywiście, mógłbym w kwerendzie andiego dodać w kryteriach: is null, ale to spowoduje utworzenie nowej, dodatkowej kwerendy. Może jest na to jakiś bardziej subtelny sposób? Dzięki za tą cenną uwagę :) Ostatecznie, po testach kwerendy wyglądają następująco:
- dołączająca:
Kod:
INSERT INTO T_OpOcen ( ID_Osoby, OpOcen_Rok, OpOcen_Ocena )
SELECT T_Osoby.ID_Osoby, T_OpOcen_temp.Rok, T_OpOcen_temp.Ocena
FROM T_OpOcen_temp INNER JOIN T_Osoby ON T_OpOcen_temp.Pesel = T_Osoby.Osoby_Pesel
WHERE (((Exists (SELECT 1 FROM T_OpOcen WHERE ID_Osoby = T_Osoby.ID_Osoby AND OpOcen_Rok = Rok))=False));

- aktualizująca:
Kod:
UPDATE (T_OpOcen INNER JOIN T_Osoby ON T_OpOcen.ID_Osoby = T_Osoby.ID_Osoby) INNER JOIN T_OpOcen_temp ON T_Osoby.Osoby_Pesel = T_OpOcen_temp.Pesel SET T_OpOcen.OpOcen_Rok = T_OpOcen_temp.Rok, T_OpOcen.OpOcen_Ocena = T_OpOcen_temp.Ocena
WHERE (((T_OpOcen.OpOcen_Rok)=[Rok]) AND ((T_OpOcen.OpOcen_Ocena)<>[Ocena]));

Pozdrawiam serdecznie i jeszcze raz bardzo dziękuję :)

_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7905

PostWysłany: Czw Sty 17, 2019 8:26 pm      Temat postu: Odpowiedz z cytatem Pisownia

Zacznijmy w tym miejscu…
PESEL w tabeli T_Osoby to pole tekstowe o rozmiarze 255, po co, a ileż to znaków ma Pesel?
Rozumiem, że T_Osoby_temp i T_OpOcen_temp to dane importowane z Excela,
wobec tego należałoby te tabele przeskanować na wstępie i usuwając rekordy nie spełniające warunków:
- długości pola
- poprawności Pesel (funkcje są na forum)
I dopiero potem uzupełnić (insert) T_Osoby , a następnie T_OpOcen

Oraz skoro Rok ma w WHERE być równy to po co, że tak powiem dla niego SET?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Pią Lut 01, 2019 8:51 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Pesel i dane osobowe pobieram z systemu, w którym już jest sprawdzona jego poprawność, więc nie mam takiej potrzeby. Oczywiście, Pesel ma 11 znaków :) Dzięki za sugestie, ponieważ właśnie dzisiaj wyszło, że plik excel i dane importowane do tabeli _temp muszą być pełne i idealne, więc ich "przeskanowanie" pod względem długości pola, zawartości pola, a w szczególności zdublowanych wartości okazało się wręcz konieczne :) Serdecznie dziękuję wszystkim za pomoc :)
_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Pią Lut 01, 2019 9:26 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

I jeszcze jedno pytanie, zakładam, że ktoś się już z tym spotkał. Chodzi o sposób wyświetlania wartości pola w widoku arkusza danych kwerendy: to samo pole (typ danych TAK/NIE) w dwóch różnych kwerendach jest inaczej wyświetlane, w jednej jako wartość -1 a w drugiej jako "kwadracik z fistaszkiem". Co powoduje zmianę na to: -1???


TAK_NIE_Tabela.png
 Opis:

Pobierz
 Nazwa pliku:  TAK_NIE_Tabela.png
 Wielkość pliku:  15.57 KB
 Pobierano:  14 raz(y)


TAK_NIE_OK.png
 Opis:

Pobierz
 Nazwa pliku:  TAK_NIE_OK.png
 Wielkość pliku:  7.76 KB
 Pobierano:  12 raz(y)


TAK_NIE_1.png
 Opis:

Pobierz
 Nazwa pliku:  TAK_NIE_1.png
 Wielkość pliku:  5.57 KB
 Pobierano:  14 raz(y)


_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7905

PostWysłany: Sob Lut 02, 2019 8:12 pm      Temat postu: Odpowiedz z cytatem Pisownia

Poproszę o tę kwerendę.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Sob Lut 02, 2019 10:36 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Proszę bardzo. Q_OpOcena_Poz_Top3 oraz Q_Med_SZwSO i Q_Med_ZZdOK. Te dwa ostatnie zapytania są bardzo do siebie podobne, ale pole Osoby_Stan_Stanowiska wyglada w nich inaczej. Czy można jakoś przyspieszyc działanie tych kwerend??? Przy 4 tyś. rekordów trochę - ok. 20 sekund trwa ich otwieranie?


Med.7z
 Opis:

Pobierz
 Nazwa pliku:  Med.7z
 Wielkość pliku:  62.16 KB
 Pobierano:  11 raz(y)


_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Bazy danych Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2, 3, 4, 5  Następny
Strona 4 z 5

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.13544 sekund, zapytan = 13
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |