Toon posts:

[ORACLE] datum probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig om een overzicht te maken waar een planning wordt gemaakt tussen een bepaalde periode.

Deze periode kan zelf worden bepaald en deze waarden sla ik op in een global variable (global.begindatum en global.einddatum).

Mijn vraag is nu: Hoe maak ik een query die dit voorelkaar krijgt.

Een procedure met 'select blabla into v_blabla' wil niet aangezien dit maar 1 return waarde geeft en in mijn geval heb ik er 4.

Een lov-knop met daarin de where statement (where :recreatie.overzicht between 'global.begindatum' and 'global.einddatum') werkt ook niet. De global variabelen worden dan niet gevonden (wat achteraf ook logisch was.. :o). Verander ik de global variable echter in een vaste datum bijv: '31-10-2003' dan werkt het wel maar dan kan ik geen periode selecteren (wat ook logisch is :o).

Anyway, ik zit helemaal vast en zie geen andere oplossing. Iemand enig idee hoe ik dit kan oplossen?

[ Voor 6% gewijzigd door Verwijderd op 28-10-2003 14:29 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Even in m'n kristallen bol kijken....hmmmmm....
Je werkt met Oracle Forms?
De globals waar je het over hebt zijn globals in forms?

Een lov knop met een where clause???

Algemene tip: een global in forms is altijd een character variabele.

Who is John Galt?


Verwijderd

Het is een beetje verwarrend wat je wilt, maar dat wordt wel duidelijk.

Even een paar puntjes: gebruik nooooooit "select into". Slecht voor de performance, niet onderhoudbaar, lastig met het ophalen van meerdere rijen. Definieer een cursor, en fetch de waarden in een rowtype die je definieert als
code:
1
  r_cursor c_cursor%ROWTYPE;

Dan kan je ook makkelijk een loop maken om meerdere rijen op te halen (hoef je de variabele niet te definieren, dat doe je impliciet met de code
code:
1
2
3
4
5
for r_cursor in c_cursor
loop
  ...
  ...
end loop;

Waarin c_cursor de naam van je cursor is en r_cursor je cursorvariabele.

Kan je misschien nog even iets beter uitleggen wat je wilt ophalen en welke gegevens je al hebt? Dan kan ik misschien wat meer hulp bieden.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
hier stond iets doms

[ Voor 90% gewijzigd door EfBe op 28-10-2003 15:50 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Verwijderd schreef op 28 October 2003 @ 14:27:
Ik ben bezig om een overzicht te maken waar een planning wordt gemaakt tussen een bepaalde periode.

Deze periode kan zelf worden bepaald en deze waarden sla ik op in een global variable (global.begindatum en global.einddatum).

Mijn vraag is nu: Hoe maak ik een query die dit voorelkaar krijgt.

Een procedure met 'select blabla into v_blabla' wil niet aangezien dit maar 1 return waarde geeft en in mijn geval heb ik er 4.

Een lov-knop met daarin de where statement (where :recreatie.overzicht between 'global.begindatum' and 'global.einddatum') werkt ook niet. De global variabelen worden dan niet gevonden (wat achteraf ook logisch was.. :o). Verander ik de global variable echter in een vaste datum bijv: '31-10-2003' dan werkt het wel maar dan kan ik geen periode selecteren (wat ook logisch is :o).
Ik zit je bericht nog eens te lezen...
Als je toch met Forms werkt, dan vult de 'gebruiker' toch gewoon twee datums in, en onder de when-button-pressed van een knop stop je toch gewoon een stukje code waarin je de default_where van een multirecord-block aanpast? Vervolgens doe je een execute_query van dat block en voila!

Je zegt wel rapportage, dus misschien wil je Reports aanroepen. lijkt me ook niet heel lastig, met Run_product en wat parameters ben je er ook.
Die globals heb je imho helemaal niet nodig (ROTDINGEN!)... zo dat is er uit :P

Of heb je al een oplossing gevonden?

Verwijderd

Topicstarter
Verwijderd schreef op 28 October 2003 @ 15:59:
[...]


Ik zit je bericht nog eens te lezen...
Als je toch met Forms werkt, dan vult de 'gebruiker' toch gewoon twee datums in, en onder de when-button-pressed van een knop stop je toch gewoon een stukje code waarin je de default_where van een multirecord-block aanpast? Vervolgens doe je een execute_query van dat block en voila!

Je zegt wel rapportage, dus misschien wil je Reports aanroepen. lijkt me ook niet heel lastig, met Run_product en wat parameters ben je er ook.
Die globals heb je imho helemaal niet nodig (ROTDINGEN!)... zo dat is er uit :P

Of heb je al een oplossing gevonden?
Nee, ben er nog niet uit.. Ben eerst maar even verder gegaan met een ander formulier.

Ik heb idd 2 formulieren:

1 waar de begin- en einddatum kan worden ingevuld en 1 voor het overzicht.

pic 1

Nu hoop ik dat de plaatjes het doen (c/p in new window prolly) anders zal ik ze vanavond op mijn eigen webhost zetten.

Deze datums worden met global variabelen (:global.begindatum en :global.einddatum) meegenomen naar het volgende form. (hier komen geen tabellen aan te pas)

De tweede tabel is gebaseerd op recreatieoverzicht waar alle gegevens uit worden gehaald (resnr, artnr, aantal en datum)

pic 2

Vervolgens moet er in de execute_query mode een planning worden gemaakt waar alleen de waarden worden getoond die tussen de begin- en einddatum vallen.

Ik heb nog even mijn boek erbij gepakt maar daar staat niet veel in over cursors in (1 pagina precies zonder voorbeeld dus dat is weer lekker duidelijk). alleen select into wordt behandeld maar als ik dit zo lees dan is een cursor veel beter. Zou je dat nog kunnen toelichten? Verder hoef ik niks met reports te doen. Zoals het ernu uitziet dan is het voldoende. Alleen het functionele gedeeltje moet nu nog aan de praat.
knop stop je toch gewoon een stukje code waarin je de default_where van een multirecord-block aanpast? Vervolgens doe je een execute_query van dat block en voila!
Dit is volgens mij ook een mogelijkheid alleen heb ik geen idee waar je de WHERE kan aanpassen van het multi-record block (server kant?).

op dit moment staat er onder de when-button-pressed trigger een do_commit en daarna wordt het volgende form aangeroepen.

Ik ga even proberen of ik dit ook met een view kan oplossen.

[ Voor 25% gewijzigd door Verwijderd op 28-10-2003 16:32 ]


  • Chillz
  • Registratie: Augustus 2001
  • Laatst online: 17:47
Oracle werkt ook met date-counts
oftewel: het x-aantal dagen vanaf <datum>

ben zelf meer thuis in SQL Server (die dat niet heeft)
dus je zal (of iemand) zelf even uit moeten zoeken hoe het precies werkt...

als je het dan hebt, dan kun je gewoon 1 vaste datum nemen (in t verleden, bijv. 1900 ofzo) en dan laat je in je berekeningen alle nieuwe datums daar vanaf leiden.

als een te plannen activiteit dan 3 dagen duurt bv. dan rekent hij zelf de nieuwe datum door startdatum + 3 te nemen (en Oracle zet het dan lief voor je om naar een goede datum-notatie)
je kan dan dus met getallen werken in je berekeningen in plaats van met datums te moeten gaan rekenen wat een stuk lastiger is.

Leeg - Sinds 20180907


Verwijderd

Verwijderd schreef op 28 oktober 2003 @ 16:22:
[...]
1 waar de begin- en einddatum kan worden ingevuld en 1 voor het overzicht.

pic 1

Nu hoop ik dat de plaatjes het doen (c/p in new window prolly) anders zal ik ze vanavond op mijn eigen webhost zetten.

Deze datums worden met global variabelen (:global.begindatum en :global.einddatum) meegenomen naar het volgende form. (hier komen geen tabellen aan te pas)

De tweede tabel is gebaseerd op recreatieoverzicht waar alle gegevens uit worden gehaald (resnr, artnr, aantal en datum)

pic 2

Vervolgens moet er in de execute_query mode een planning worden gemaakt waar alleen de waarden worden getoond die tussen de begin- en einddatum vallen.
Ah, al iets duidelijker! Het zou makkelijker zijn om die functionaliteit in een scherm te houden, maar ik neem aan dat het niet anders kan.
Ik neem aan dat je de aanroep van het ene naar het andere scherm goed hebt? Dus bij de gebruikersactie die het andere scherm aanroept kopieer je de waarden uit de velden naar de globals (goed op het datum formaat letten bij converteren want globals zijn inderdaad altijd CHAR).
Het tweede scherm is dus query-only, daar haal je die waarden weer uit je global en zet ze in je veldjes.

Nu het probleem voor jou. Een block heeft een eigenschap 'where_clause'.
Die zet je door de volgende code:
code:
1
Set_Block_Property( 'BLOCKNAAM' , Default_Where, 'whereclause' );


Natuurlijk moet je block een databaseblock zijn en gebaseerd op een view of tabel.
Ik heb nog even mijn boek erbij gepakt maar daar staat niet veel in over cursors in (1 pagina precies zonder voorbeeld dus dat is weer lekker duidelijk). alleen select into wordt behandeld maar als ik dit zo lees dan is een cursor veel beter. Zou je dat nog kunnen toelichten? Verder hoef ik niks met reports te doen. Zoals het ernu uitziet dan is het voldoende. Alleen het functionele gedeeltje moet nu nog aan de praat.
voorbeeld cursortje 1:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare
  Cursor c_test is
    select col1
    ,      col2
    from test
  ;
  r_test    c_test%ROWTYPE;
  l_tmp     varchar2(10);
begin
  open c_test;
  fetch c_test into r_test;
  close c_test;
  l_tmp := r_test.col1;
end;


voorbeeld cursortje 2:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare
  Cursor c_test( b_waarde varchar2(10) ) is
    select col1
    ,      col2
    from test
    where col3 = b_waarde
  ;
  l_tmp     varchar2(10);
begin
  for r_test in c_test( 'BLAAT' )
  loop
    l_tmp := r_test.col1;
  end loop;
end;


Kijk ook eens op de documentatie site van oracle (tahiti.oracle.com) of in de Forms help, staat ontzettend veel in.
[...]
Dit is volgens mij ook een mogelijkheid alleen heb ik geen idee waar je de WHERE kan aanpassen van het multi-record block (server kant?).
Oke, die had ik al uitgelegd.
op dit moment staat er onder de when-button-pressed trigger een do_commit en daarna wordt het volgende form aangeroepen.

Ik ga even proberen of ik dit ook met een view kan oplossen.
Denk niet dat je een view nodig hebt.
Laat maar even weten of je nog meer hulp nodig hebt. Je kan ook mailen naar patrick _ sinke at yahoo dot com . Wel even wat spaties weghalen en @/. vervangen voordat je op Send ramt :P

Verwijderd

Topicstarter
Harstikke bedankt voor je uitleg Patrickje! _/-\o_ _/-\o_

de where code kon inderdaad in de where_clause van het datablock. Werkt uitstekend! :)

Ook is het mij gelukt om een cursor te maken om zo meerdere gegevens in de velden te zetten voor een ander formulier (met wat extra hulp van de help ;)).

Thanks! :D

Verwijderd

Graag gedaan :P
Pagina: 1