Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] PHP a baza z IBM iSeries As/400
Forum PHP.pl > Forum > Przedszkole
dopal
Witam,

Zacznę od opisania sytuacji, którą posiadam.
Na jednym kompie ( winxp) mam zrobiony serwer www (apache, mysql, php ), gdzie mi wszystko działa jak należy. Wykorzystywany na różne potrzeby.
Drugi sprzęt to typowy serwer IBM iSeries As/400, na którym działa głowny program.

Teraz chciałbym pobrać z serwera IBM pewne dane z bazy danych i wyświetlić je pod php.

Zrobiłem coś takiego. Na kompie gdzie jest serwer www w Administratorze danych ODBC ustawiłem połączenie z serwerem IBM.

Następnie stworzyłem plik w php z poniższym kodem, gdzie mam zapytanie do bazy.

  1. <?php
  2. $user = "xxxxxxx";
  3. $pass = "xxxxxxx";
  4. $connect = odbc_connect("bank", $user, $pass);
  5. if ( ! $connect)
  6. die( "błąd w połączeniu z AS/400" );
  7. print "polaczenie nawiazane :-)";
  8. ?>
  9. <table>
  10. <tr><td width="3%" align="center">Pracownia.</td>
  11. <td width="14%" align="center"><b>kod</b></td>
  12. <td width="10%" align="center"><b>Numer</b></td>
  13. <td width="10%" align="center"><b>magazyn</b></td>
  14. <td width="7%" align="center"><b>data</b></td>
  15. <td width="7%" align="center"><b>objetosc</b></td>
  16. <td width="6%" align="center"><b>jednostka</b></td></tr>
  17.  
  18.  
  19.  
  20. <?php
  21. $query = "
  22. SELECT
  23. MAGPOJ.MAPJPO,
  24. MAGPOJ.MASRPK,
  25. MAGPOJ.MAPLIS,
  26. MAGPOJ.MADNNR,
  27. MAGPOJ.MADNDT,
  28. MAGPOJ.MAPJIL,
  29. MAGPOJ.MAPJIJ
  30.  
  31. FROM DAWCY, MAGPOJ, ODDANIA, SLRPRE
  32.  
  33. WHERE (MAGPOJ.MAPJOD=0 AND MAGPOJ.MAPLIS='Z1234'
  34. And MAGPOJ.MAPJPO=186
  35. AND MAGPOJ.MADNDT Between 20111001 And 20120805)
  36. AND (MAGPOJ.MAPJDR=0)
  37. AND (MAGPOJ.MADNPK=oddnpk)
  38. AND (MAGPOJ.MADNNR=oddnnr)
  39. AND (ODDANIA.ODPLNR=DAplnr)
  40. AND (ODDANIA.ODDWNR=dadwnr)
  41. AND (DAWCY.DADWEX='K')
  42. AND (SLRPRE.SPSRPX In ('FFP','OSOCZ'))
  43. AND (MAGPOJ.MASRPK=SPSRPK)
  44.  
  45. ORDER BY MAGPOJ.MAPJPO, MAGPOJ.MASRPK";
  46.  
  47.  
  48.  
  49.  
  50.  
  51. $result = odbc_do($connect, $query);
  52.  
  53.  
  54. $ilosc = odbc_num_rows($result);
  55. echo '<td width="20%">Ilosc wprowadzonych parametrów: <b>'.$ilosc.'</b></td>';
  56.  
  57.  
  58. $obAmount=odbc_num_rows($result);
  59.  
  60.  
  61. for($x=0;$x<$obAmount;$x++)
  62. {
  63.  
  64.  
  65. while ($wynik = odbc_fetch_row($result))
  66.  
  67. {
  68. echo '<tr><td align="center">'.($x+1).'</td>
  69. <td>'.$wynik['MAGPOJ.MAPJIJ'].'</td>
  70. <td align="center">'.$wynik['MAGPOJ.MASRPK'].'</td>
  71. <td align="center">'.$wynik['MAGPOJ.MAPJIL'].'</td>
  72. <td align="center"></td>
  73. <td align="center"></td>
  74.  
  75. <td>'.$row['pracownik'].'</td></tr>';
  76. }
  77. }
  78. odbc_close($connect);
  79.  
  80. ?>
  81.  


Połączenie z bazą zostaje nawiązane proawidłowo.
W pozycji "Ilosc wprowadzonych parametrów:" otrzymuję prawidłową ilość rekordów jaka powinna zostać pobrana z bazy serwera IBM np. 278
Tworzy mi się tabela z odpowiednią ilością wierszy np. 278
Problem polega na tym, że te wiersze są puste, tzn. poza liczbą porządkową w dalszej części wiersza nie ma nic.

Ale dane chyba zostają pobrane prawidłowo, skoro liczba rekordów jest prawidłowa?
Może jest jakiś problem w kodzie? ( to pierwsza moja taka "zabawa" z php i ibm)
Może trzeba coś dograć do php lub zmienić w php.ini?

Ma ktoś jakiś pomysł jak to zrobić by wyniki sie wyświetlały prawidłowo?

Pozdrawiam
nospor
1) for($x=0;$x<$obAmount;$x++) - jest to toalnie zbędne..... wiersze przecież pobierasz w WHILE....
2) Skoro wiersz zapisujesz w $wynik to do jasnej ciasnej nie szukaj go w $row....
3)
W pętli WHILE daj
print_r($wynik);
i wszystko nagle stanie się tak oczywiste że aż dziw że sam print_r nie użyłeś......

4) A na przyszłość włącz wyświetlanie błędów to wszystko na dzień dobry dostaniesz na ekranie monitora..... TU masz napisane jak tę rzecz się robi:
Temat: Jak poprawnie zada pytanie
dopal
Cytat(nospor @ 22.10.2012, 12:42:34 ) *
1) for($x=0;$x<$obAmount;$x++) - jest to toalnie zbędne..... wiersze przecież pobierasz w WHILE....
2) Skoro wiersz zapisujesz w $wynik to do jasnej ciasnej nie szukaj go w $row....
3)
W pętli WHILE daj
print_r($wynik);
i wszystko nagle stanie się tak oczywiste że aż dziw że sam print_r nie użyłeś......

4) A na przyszłość włącz wyświetlanie błędów to wszystko na dzień dobry dostaniesz na ekranie monitora..... TU masz napisane jak tę rzecz się robi:
Temat: Jak poprawnie zada pytanie


Jeśli chodzi o pkt 1. to chciałem by każdy wiersz był numerowany liczbą porządkową, dlatego tak zrobiłem.
Pkt2. To pozostałość po różnych moich testach, akurat mało istotna, bo to i tak nie wpływało na mój problem.
pkt3. Dawałem print_r($wynik), ale nic to nie daje.( w tej wersji kodu co zamieściłem mogło akurat nie być )
Jedyna informacja jaką dostaję to przy var_dump($wynik); otrzymuję bool(true) tyle razy ile jest wierszy.

Nospor nie patrz na takie "drobne" niedociągnięcia, bo to starałem się wszystko sprawdzić.

  1. <?php
  2. $user = "xxxxx";
  3. $pass = "xxxxxx";
  4. $connect = odbc_connect("bank", $user, $pass);
  5. if ( ! $connect)
  6. die( "błąd w połączeniu z AS/400" );
  7. print "polaczenie nawiazane :-)";
  8. ?>
  9. <table><tr><td width="3%" align="center">LP.</td>
  10. <td width="3%" align="center">Pracownia</td>
  11. <td width="14%" align="center"><b>kod</b></td>
  12. <td width="10%" align="center"><b>Numer</b></td>
  13. <td width="10%" align="center"><b>magazyn</b></td>
  14. <td width="7%" align="center"><b>data</b></td>
  15. <td width="7%" align="center"><b>objetosc</b></td>
  16. <td width="6%" align="center"><b>jednostka</b></td></tr>
  17.  
  18.  
  19.  
  20. <?php
  21. $query = "
  22. SELECT
  23. MAGPOJ.MAPJPO,
  24. MAGPOJ.MASRPK,
  25. MAGPOJ.MAPLIS,
  26. MAGPOJ.MADNNR,
  27. MAGPOJ.MADNDT,
  28. MAGPOJ.MAPJIL,
  29. MAGPOJ.MAPJIJ
  30.  
  31. FROM DAWCY, MAGPOJ, ODDANIA, SLRPRE
  32.  
  33. WHERE (MAGPOJ.MAPJOD=0 AND MAGPOJ.MAPLIS='Z5200'
  34. And MAGPOJ.MAPJPO=186
  35. AND MAGPOJ.MADNDT Between 20111001 And 20111005)
  36. AND (MAGPOJ.MAPJDR=0)
  37. AND (MAGPOJ.MADNPK=oddnpk)
  38. AND (MAGPOJ.MADNNR=oddnnr)
  39. AND (ODDANIA.ODPLNR=DAplnr)
  40. AND (ODDANIA.ODDWNR=dadwnr)
  41. AND (DAWCY.DADWEX='K')
  42. AND (SLRPRE.SPSRPX In ('FFP','OSOCZ'))
  43. AND (MAGPOJ.MASRPK=SPSRPK)
  44.  
  45. ORDER BY MAGPOJ.MAPJPO, MAGPOJ.MASRPK";
  46.  
  47. $result = odbc_exec($connect, $query);
  48.  
  49. $obAmount=odbc_num_rows($result);
  50.  
  51. for($x=0;
  52. $x<$$obAmount;
  53. $x++)
  54. {
  55.  
  56. while(odbc_fetch_row($result))
  57.  
  58. {
  59. $MAPJPO = odbc_result($result, 1);
  60. $MASRPK = odbc_result($result, 2);
  61. $MAPLIS = odbc_result($result, 3);
  62. $MADNNR = odbc_result($result, 4);
  63. $MADNDT = odbc_result($result, 5);
  64. $MAPJIL = odbc_result($result, 6);
  65. $MAPJIJ = odbc_result($result, 7);
  66.  
  67.  
  68. {
  69. echo '<tr><td align="center">'.($x+1).'</td>
  70. <td align="center">'.$MAPJPO.'</td>
  71. <td align="center">'.$MASRPK.'</td>
  72. <td align="center">'.$MAPLIS.'</td>
  73. <td align="center">'.$MADNNR.'</td>
  74. <td align="center">'.$MADNDT.'</td>
  75. <td align="center">'.$MAPJIL.'</td>
  76. <td align="center">'.$MAPJIJ.'</td></tr>';
  77. }}
  78. }
  79.  
  80.  
  81. ?></table><?php
  82. $ilosc = odbc_num_rows($result);
  83. echo '<td width="20%">Ilosc wprowadzonych parametrów: <b>'.$ilosc.'</b></td>';
  84. odbc_close($connect);?>


Przerobiłem to inaczej, obecnie tak to wygląda i nawet działa, poza liczbą porządkową, bo ciągle jest 1.

Może być w takiej formie czy coś tu jeszcze zmienić?
nospor
Robiąc print_r/var_dump i widząc właśnie TRUE to można było się domyślec że odbc_fetch_row nie zwraca rekordu danych, nieprawdaż?
Użyłeś wkońcu odbc_result - brawo smile.gif

Powtarzam: pętla FOR jest zbędna gdyż się podwójnie zapętlasz. Pętla WHILE jest wystarczająca gdyż to ona lata po rekordach....
Chcesz mieć kolejny numerek? Nie ma problemu, naprawdę w pętli nie potrafisz zwiększać zmiennej powiedzmy $i o 1?

$i=0;
while(...){
$i++;
echo $i;
}
dopal
Oczywistą oczywistością jest to, że nie wszystko wiem, dlatego tu sie pytam.
A swoją drogą nic nie wspominałeś o odbc_result smile.gif
W jakimś manualu gdzieś to przeczytałem, tylko ile czasu na to poświęciłem....
Dobra mniej więcej to działa tak jak chciałem....
choć teraz czeka mnie trudniejsze zadanie (chyba )

Od osoby, która programowała program na serwer ibm dostałem taki opis zapytania ( tak to sie wykonuje w programie na ibm)
a teraz to muszę przełożyć na php....
Masz jakąś podpowiedź? Jak sie do tego zabrać?

parametry wejściowe:
• plnr - numer placówki (7000)
• plis - numer isbt
• srpk - klasa preparatu
• dndt - data donacji
• pjdwo - data produkcji od
• pddwd - data produkcji do
• pjp1 - pierwsza pracownia
• plc - placówka
• p_grprep - grupa preparatów
• pjpo - pracownia odbierająca

algorytm
1. jeśli PLNR = 0 (placówka nie wpisana) to pobierz bieżącą
2. jeśli istnieje usuwamy qtemp/mk_produkcja
3. ATRIB = 0
4. SQL = 'CREATE TABLE QTEMP/MK_PRODUKCJA AS ( '
SQL = SQL + ' SELECT DISTINCT MAPLNR, MASRPK, '
SQL = SQL + ' ISBT_PROD( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, '
SQL = SQL + ' MAPJZW ) AS ATRYBUTY, '
SQL = SQL + ' MADNPK, MAPLIS, MADNNR, MAPJNR,'
SQL = SQL + ' MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ,'
SQL = SQL + ' MAPJWG, MAPJTM, SPSRPO, MAPRCN'
SQL = SQL + ' FROM MAGPOJ, SLRPRE'
SQL = SQL + ' WHERE MASRPK = SPSRPK'
5. Jeśli wpisano PLNR, to SQL = SQL + ' AND MAPLNR = ' + PLNR
6. Jeśli wpisano PLIS, to SQL = SQL + ' AND MAPLIS = ''' + PLIS + ''''
7. Jeśli wpisano SRPK, to
SQL = SQL + ' AND MASRPK = ''' + SRPK + ''''
8. Jeśli wpisano P_GRPREP, to
SQL = SQL + ' AND TRIM( SPSRPX ) = TRIM( '''+ P_GRPREP + ''')'
9. Jeśli wpisano PJP1 , to
SQL = SQL + ' AND MAPJP1 = ' + PJP1
10. Jeśli wpisano PJPO , to
SQL = SQL + ' AND MAPJPO = ' + PJPO
11. Jeśli wpisano DNDTO, to
SQL = SQL + ' AND MADNDT = ' + DNDTO
12. Jeśli wpisano PJDWO oraz PJDWD , to
SQL = SQL /// ' AND MAPJDW BETWEEN ' // PJDWO // ' AND ' // PJDW
13. Jeśli nie wpisano PJDWO oraz PJDWD , to
14. SQL = SQL /// ' AND MAPJDW = ' // PJDWO
15. SQL = SQL /// ' ) WITH DATA '
16. Wykonaj skrypt stworzony w zmiennej SQL (założy on tabelę MK_PRODUKCJA)
17. Usuń tabelę QTEMP/MK_PODSUMOWANIE
18. Wykonaj sql:
CREATE TABLE QTEMP/MK_PODSUMOWANIE AS (
SELECT MASRPK, ATRYBUTY, COUNT (*) ILE,
SUM( MAPJIL ) ILO,
SUM( MAPJIJ ) ILJ
FROM QTEMP/MK_PRODUKCJA
GROUP BY MASRPK, ATRYBUTY
ORDER BY MASRPK, ATRYBUTY ) WITH DATA
19. Stwórz kursor o nazwie query:
DECLARE QUERY CURSOR FOR
SELECT * FROM QTEMP/MK_PRODUKCJA
ORDER BY MAPLNR, MASRPK, ATRYBUTY
20. Otwórz kursor
21. Zawartość kursora umieść w zmiennych:
FETCH NEXT FROM QUERY INTO
:PLNR , :SRPK , :ATRIB , :DNPK , :PLIS , :DNNR ,
:PJNR , :DNDT , :PJDW , :PJP1 ,
:PJIL , :PJIJ , :PJWG , :PJTM ,
:SRPO , :PRCN
22. Umieść zawartość zmiennych w zmiennych tymczasowych
SRPK_OLD = SRPK
ZZ_SRPK = SRPK < - to idzie na ekran
OLD_ATRIB = ATRIB
Z_ATR = ATRIB <- to idzie na ekran
ZZ_SRPO = SRPO <- to idzie na ekran
23. Oblicz podsumowanie
SELECT ILE, ILO, ILJ INTO :Z_ILE , :Z_ILO , :Z_ILJ
FROM QTEMP/MK_PODSUMOWANIE WHERE MASRPK = :SRPK
AND ATRYBUTY = :ATRIB
24. Przekształć mililitry w litry : Z_ILO = Z_ILO/1000
25. Poniższe instrukcje wykonywane są w pętli, tak długo jak długo SQL nie zwróci błędu
26. Jeśli donacja jest w standardzie ISBT (DNNR > 1000000 ) to wyświetl
ZZ_PLIS = PLIS oraz ZZ_DNNR = DNNR
27. Jeśli donacja nie jest w standardzie ISBT, to
wstaw slash w środek DNPK i przypisz do ZZ_PLIS, to będzie wyświetlane
28. Wyświetl zmienne:
• ZZ_PJNR = PJNR
• ZZ_DNDT = DNDT
• ZZ_PJDW = PJDW
• ZZ_PJIL = PJIL
• ZZ_PJIJ = PJIJ
• ZZ_PJWG = PJWG
• ZZ_PJTM = PJTM
• ZZ_PRCN = PRCN
29. Podsumowanie dla kolejnych preparatów, tylko wtedy jeśli SRPK_OLD <> SRPK lub OLD_ATRIB <> ATRIB (zmienił się kod ostateczny):
30. Przypisz:
SRPK_OLD = SRPK
OLD_ATRIB = ATRIB
31. Wyzeruj zmienne: Z_ILE Z_ILO Z_ILJ
32. Przypisz zmienne, które pójdą na ekran
ZZ_SRPK = SRPK
Z_ATR = ATRIB
ZZ_SRPO = SRPO
33. Podlicz podsumowanie dla kolejnego preparatu
SELECT ILE, ILO, ILJ INTO :Z_ILE , :Z_ILO , :Z_ILJ
FROM QTEMP/MK_PODSUMOWANIE WHERE MASRPK = :SRPK
AND ATRYBUTY = :ATRIB
34. Zamień mililitry na litry Z_ILO = Z_ILO/1000
35. Koniec tworzenia podsumowania
36. Pobierz zmienne z kusora
FETCH NEXT FROM QUERY INTO
:PLNR , :SRPK , :ATRIB , :DNPK , :PLIS , :DNNR ,
:PJNR , :DNDT , :PJDW , :PJP1 ,
:PJIL , :PJIJ , :PJWG , :PJTM ,
:SRPO , :PRCN
37. Koniec pętli
38. Pobierz tekst dla wydruków, typ: 'PRD' z tabeli WYDRUKI
39. Zamknij kursor
nospor
Cytat
A swoją drogą nic nie wspominałeś o odbc_result
W jakimś manualu gdzieś to przeczytałem, tylko ile czasu na to poświęciłem....
Raczysz żartować....
http://pl1.php.net/manual/pl/function.odbc-fetch-row.php
"After odbc_fetch_row() is called, the fields of that row can be accessed with odbc_result()."

Znalezienie tej informacji zajmuje 10 sekund.

Cytat
Oczywistą oczywistością jest to, że nie wszystko wiem, dlatego tu sie pytam.
Tak, tylko jak ci piszę, że coś jest zbędne, znaczy że jest to zbędne a nie ty mi dalej wykładasz swoją filozofię zamiast przetrawić to co mówie.... tongue.gif

Co do dalszego algorytmu to co mam ci powiedzieć? No musisz krok po kroku wykonać to co masz napisane. Jest to dość szczegółowo opisane, nic tylko to wykonać.
dopal
Taaaa....wykonać....pewnie z tydzień mi to zajmie i pewnie będę Cię męczył o pomoc, ale się to wykona smile.gif
Także na wszelki wypadek nie zamykaj tematu.
nospor
Cytat
Także na wszelki wypadek nie zamykaj tematu.
A czemu miałbym niby zamykać temat? Widziałeś tu na forum normalne tematy pisane przez normalnych userów by były zamknięte? smile.gif
dopal
A jednak nie portafię sobie poradzić. Trochę poszperałem w necie, ale to co znalazłem niestety nie działa jak należy.

Utknałem od razu na samym początku. na tych punktach co poniżej.
Głównie chodzi o pkt 4 czyli poprawna składnia

1. jeśli PLNR = 0 (placówka nie wpisana) to pobierz bieżącą
2. jeśli istnieje usuwamy qtemp/mk_produkcja
3. ATRIB = 0
4. SQL = 'CREATE TABLE QTEMP/MK_PRODUKCJA AS ( '
' SELECT DISTINCT MAPLNR, MASRPK, '
' ISBT_PROD( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, '
SQL = SQL + ' MAPJZW ) AS ATRYBUTY, '
SQL = SQL + ' MADNPK, MAPLIS, MADNNR, MAPJNR,'
SQL = SQL + ' MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ,'
SQL = SQL + ' MAPJWG, MAPJTM, SPSRPO, MAPRCN'
SQL = SQL + ' FROM MAGPOJ, SLRPRE'
SQL = SQL + ' WHERE MASRPK = SPSRPK'

Staram się to "przełożyć" na php i tworzę zapytanie:

  1. <?php
  2. $user = $_POST['osoba'];
  3. $pass = $_POST['haslo'];
  4. $connect = odbc_connect("bank", $user, $pass);
  5. if ( !$connect ) {
  6. }
  7. elseif ( $connect) {
  8.  
  9. $query="CREATE TEMPORARY TABLE PRODUKCJA AS
  10. SELECT DISTINCT MAPLNR, MASRPK, ISBT_PROD ( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, MAPJZW ) AS ATRYBUTY,
  11. MADNPK, MAPLIS, MADNNR, MAPJNR, MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ, MAPJWG, MAPJTM, SPSRPO, MAPRCN
  12. FROM MAGPOJ, SLRPRE
  13. WHERE MASRPK = SPSRPK
  14. " ;
  15.  
  16. $result = odbc_exec($connect, $query) or die( odbc_error());
  17.  
  18. $ilosc = odbc_num_rows($result);
  19. ?>


Otrzymuję komunikat:

Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0104 - Niepoprawny leksem TEMPORARY. Poprawne leksemy: SUMMARY., SQL state 37000 in SQLExecDirect in D:\www\apache\htdocs\zest2.php on line 67
37000

Próbowałem zamiast temorary używać składni jakie znalazłem w necie...efekt żaden.
Podobnie z Select, który brałem w (), dawałem ', " i ciągle nic.

Jak poprawnie powinno to wyglądać?
nospor
No ale przecież w instrukcji masz napisane wyraźnie że ma być:
CREATE TABLE QTEMP/MK_PRODUKCJA
a ty napisałeś inaczej. Czy kod z instrukcji nie działa?
dopal
Jeśli robię tak jak w instrukcji dostaje komunikat:

Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL5016 - Nazwa obiektu MK_PRODUKCJA jest niepoprawna., SQL state S1000 in SQLExecDirect in D:\www\apache\htdocs\zest2.php on line 67
S1000
nospor
Poprostu zrób tak:
CREATE TABLE PRODUKCJA AS
dopal
Jeśli robię tak:

  1. <?php
  2. $query="CREATE TABLE PRODUKCJA AS
  3. SELECT DISTINCT MAPLNR, MASRPK, ISBT_PROD ( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, MAPJZW ) AS ATRYBUTY,
  4. MADNPK, MAPLIS, MADNNR, MAPJNR, MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ, MAPJWG, MAPJTM, SPSRPO, MAPRCN
  5. FROM MAGPOJ, SLRPRE
  6. WHERE MASRPK = SPSRPK
  7. " ;
  8.  
  9. ?>


Otrzymuję:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0199 - Nieoczekiwane s�owo kluczowe SELECT. Poprawne leksemy: (., SQL state 37000 in SQLExecDirect in D:\www\apache\htdocs\zest2.php on line 67
37000

A jeśli tak:

  1. <?php
  2. $query="CREATE TABLE PRODUKCJA AS
  3. ( SELECT DISTINCT MAPLNR, MASRPK, ISBT_PROD ( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, MAPJZW ) AS ATRYBUTY,
  4. MADNPK, MAPLIS, MADNNR, MAPJNR, MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ, MAPJWG, MAPJTM, SPSRPO, MAPRCN
  5. FROM MAGPOJ, SLRPRE
  6. WHERE MASRPK = SPSRPK )
  7. " ;
  8.  
  9. ?>


Otrzymuję:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0104 - Niepoprawny leksem <END-OF-STATEMENT>. Poprawne leksemy: DATA WITH DEFINITION., SQL state 37000 in SQLExecDirect in D:\www\apache\htdocs\zest2.php on line 67
37000
nospor
No to nie wiem. Nie znam bazy IBM. Pewnie chodzi o jakiś drobiazg, ale nie mogę nic wygooglac bo mi net chodzi jakby chiał a nie mógł :/
dopal
Pewnie masz rację, że jakis drobiazg, to co napisałem na początku postu, to ten skrypt ładnie się wykonuje i juz go sobie obrobiłem jak cchiałem.
A tu niby opis jasny i czytelny ( swoją drogą od bardzo dużej firmy informatycznej w kraju)
a nie potrafią mi powiedzieć jak to przełożyć na php, coś ściemniają...

Też będę szukał w necie rozwiązania...
A gdyby net chodził Ci szybciej, to może Ty coś znajdziesz.

nospor
Sróbuj jeszcze tak:
CREATE TABLE QTEMP.MK_PRODUKCJA AS
czyli zamien / na .
dopal
  1. <?php
  2. $query="CREATE TABLE QTEMP.MK_PRODUKCJA AS
  3. SELECT DISTINCT MAPLNR, MASRPK, ISBT_PROD ( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, MAPJZW ) AS ATRYBUTY,
  4. MADNPK, MAPLIS, MADNNR, MAPJNR, MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ, MAPJWG, MAPJTM, SPSRPO, MAPRCN
  5. FROM MAGPOJ, SLRPRE
  6. WHERE MASRPK = SPSRPK
  7. " ;
  8. ?>
  9.  


Komunikat:
Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0199 - Nieoczekiwane s�owo kluczowe SELECT. Poprawne leksemy: (., SQL state 37000 in SQLExecDirect in D:\www\apache\htdocs\zest2.php on line 67
37000
nospor
No ale teraz skolei zjadłeś nawiasy smile.gif
dopal
Zamiast nawiasów to wolałbym jakąś bułkę smile.gif
  1. <?php
  2. $query="CREATE TABLE QTEMP.MK_PRODUKCJA AS
  3. ( SELECT DISTINCT MAPLNR, MASRPK, ISBT_PROD ( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, MAPJZW ) AS ATRYBUTY,
  4. MADNPK, MAPLIS, MADNNR, MAPJNR, MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ, MAPJWG, MAPJTM, SPSRPO, MAPRCN
  5. FROM MAGPOJ, SLRPRE
  6. WHERE MASRPK = SPSRPK )
  7. " ;
  8. ?>


Chyba w złym miejscu te nawiasy....
Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0104 - Niepoprawny leksem <END-OF-STATEMENT>. Poprawne leksemy: DATA WITH DEFINITION., SQL state 37000 in SQLExecDirect in D:\www\apache\htdocs\zest2.php on line 67
37000
nospor
No ale kolego czytaj jak powinno wygladac całe zapytanie. W instrukcji wyraźnie widać ze ma sie konczyc czyms takim: WITH DATA
Nawet komunikat błędu o tym wspomina
dopal
Tylko nie bardzo właśnie to rozumiem....co ma byc na tym końcu
nospor
no WITH DATA. Przecież masz napisane w instrukcji.

$query="CREATE TABLE QTEMP.MK_PRODUKCJA AS

( SELECT DISTINCT MAPLNR, MASRPK, ISBT_PROD ( MAPLNR, MASRPK, MADNPK, MADNNR, MAPJNR, MAPJZW ) AS ATRYBUTY,

MADNPK, MAPLIS, MADNNR, MAPJNR, MADNDT, MAPJDW, MAPJP1, MAPJIL, MAPJIJ, MAPJWG, MAPJTM, SPSRPO, MAPRCN

FROM MAGPOJ, SLRPRE

WHERE MASRPK = SPSRPK ) WITH DATA

" ;
dopal
Dobra postęp jest

co prawda otrzymuje komunikat:

Warning: odbc_exec() [function.odbc-exec]: SQL error: [IBM][Sterownik ODBC iSeries Access][DB2 UDB]SQL0204 - Nie znaleziono ISBT_PROD w *LIBL typu *N., SQL state S0002 in SQLExecDirect in D:\www\apache\htdocs\zest2.php on line 67
S0002

ale z tym to już musze się zwrócić do "tej specjalistycznej" firmy, pewnie jakaś zła składnia w zapytaniu.
Bez tego nie wyświetla błędów, więc prawdopodobnie działa dobrze. Przekonamy sie o tym jak dalsze punkty przerobie, ale to wieczorem dopiero.
Póki co dzięki.

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.