Avatar billede littlehelper Nybegynder
22. maj 2002 - 16:20 Der er 14 kommentarer og
1 løsning

Pl/Sql spørgsmål

jeg er så heldig at jeg har fået stillet forms tilrådighed, så jeg kan udvilke en applikation..

jeg har gjort så ledes at jeg viser en af mine tabeller på skærmen og sat den til at vise 10 columns...

det skal være så ledes at efter jeg har udfyldt et par af rækkerne at den så skal gå ned i table og finde en ledigt unikt nr og så sætte det ind i hver af de rækker som jeg har udfyldt....

så er det muligt at kunne løbe en "skærm variable column' igennem på en eller anden måde??

håber der er nogen som forstå mit spørgsmål pg som kan hjælpe mig...

:)
Avatar billede i3448 Nybegynder
22. maj 2002 - 17:01 #1
Hvis du arbejder på en Oracle database, kunne du oprette en sequence i databasen (en sequence leverer unikke numre).

Normalt ville man så på f.esk en PRE-INSERT trigger på BLOK-NIVEAU i formen, hente næste nummer fra sekvensen og opdatere løbenrfeltet.
(nummere vil så først blive vist på skærmen når der committes)
Avatar billede littlehelper Nybegynder
22. maj 2002 - 17:09 #2
mmmmm....nej... går ik, har overvejet det...min primary key består af flere felter... og det nr i den column jeg snakker om... skal være ens...

:(
Avatar billede littlehelper Nybegynder
22. maj 2002 - 17:14 #3
eksempel:

nr A  nr B nr C
1    1    1
1    1    2
1    1    3
2    1    1
2    1    2
2    1    3

nr a... skal findes ud fra hvad nr jeg er nået til i databasen og derfra kunne sætte det ind flere steder i en table colomn som kan ses på skærmen.....
Avatar billede i3448 Nybegynder
22. maj 2002 - 17:50 #4
lille kode eksempel til at gennemløbe en tabel vist i formen:

PROCEDURE upd_line_no IS
begin
  :global.line_no_fld := :system.cursor_block || '.LINE_NO';
  first_record; check_package_failure; -- Gå til første record
  if :system.last_record <> 'TRUE' then
  loop
  if upper(name_in(:global.line_no_fld)) <> :system.cursor_record then
      copy(:system.cursor_record,:global.line_no_fld);
      -- Her behandeles recorden, i dette tilfælde sættes   
      -- løbenrfeltet=recordnr
    end if;
    exit when :system.last_record = 'TRUE';
    next_record; check_package_failure; -- behandle næste record
  end loop;
  end if;
end;
Avatar billede i3448 Nybegynder
22. maj 2002 - 17:54 #5
kald upd_line_no et eller andet sted fra med flg kode:

:global.remember_rec := :system.cursor_record;
:global.remember_fld := :system.cursor_field;
  Go_Block('DATABASEBLOKKEN'); check_package_failure;
  upd_line_no;   
  Go_Field(:global.remember_fld);  check_package_failure;
  If :system.cursor_record <> :global.remember_rec Then
    go_record(:global.remember_rec); check_package_failure;
  End If;
  Go_Field(:global.remember_fld);  check_package_failure;
Avatar billede littlehelper Nybegynder
22. maj 2002 - 18:28 #6
hmm.... ja...

det giver så lige et andet problem..... hvor skal jeg smide proceduren ind henne for at jeg kan kalde den?????
Avatar billede littlehelper Nybegynder
22. maj 2002 - 19:03 #7
ved ikke rigtig om vi snakker forbi hinanden....

prøver at samlign med noget andet.... sådan lidt fri oversat programmeringsprogs sjov....

select max(nr) into idnr from table;

idnr := idnr + 1;

For 1 to n
loop

:id[n] := idnr;

i := i + 1;

end loop;

commit_form;

--------------------------------------

:id[n] skal forestille at være de/det text item(s) jeg sætter mit idnr ind i... så ledes at vær række få samme nr.... når jeg commit'er min form

for jeg har en skærm variable der hedder :ID ... men da der er mulighed for at sætte flere id ind eller vise flere id på samme tid i skærm variablen... så jeg kan ikk finde ud af at få den til at hoppe videre til næste felt i :ID skærmvariablen sådan så jeg kan give den en værdi....
Avatar billede i3448 Nybegynder
23. maj 2002 - 10:40 #8
Koden kaldes fra KEY-COMMIT som f.eks kan indeholde disse 2 linier:
upd_form;    -- en procedure i program units, som
              -- kalder første del af koden, som husker hvor
              --  cursoren var, og som videre kalder upd_line_no
              -- den anden procedure i program units
commit_form; 

koden i upd_line_no:
  copy(:system.cursor_record,:global.line_no_fld);
  -- Her behandeles recorden, i dette tilfælde sættes   
    -- løbenrfeltet=recordnr
kan du så erstatte med din egen kode til at finde løbenr ud fra
tabeller, sekvenser eller hvordan du ellers ønsker,
men løbenumrene visesstadig  først når der committes.
Avatar billede littlehelper Nybegynder
23. maj 2002 - 12:21 #9
FRM-40105: unable to resolve reference to item
TABLE2.LINE_NO.


???????
Avatar billede littlehelper Nybegynder
23. maj 2002 - 12:31 #10
TABLE2 er navnet på min block hvor item'et er.......

navnet på item'et er ID.... bare i tilfælde af at du skulle bruge det
Avatar billede littlehelper Nybegynder
23. maj 2002 - 12:38 #11
Go_Block('DATABASEBLOKKEN');

har prøvet at fjerne Go_block linien.... og så brokker den sig over at de felter hvor i der skulle være indsat et nr ikke er blevet udfyldt... så den kan ikke gemme dem :((

check_package_failure; <<------ hvad er det til?
Avatar billede i3448 Nybegynder
23. maj 2002 - 12:58 #12
mine kode eksempler er ikke en komplet løsning til dit problem,
men skulle forhåbentlig være kilde til inspiration.
du skal erstatte blok, felt og tabel navne med dine aktuelle navne
fra din form og din database.
Ud fra din sidste kommentar burde du nok bede om et forms kursus (det er et rimeligt omfattende design værktøj - og man får nok ikke det bedste resultat, hvis man er på bar bund og skal gætte sig til brugen af produktet).
f.eks GO_BLOCK('DATABASEBLOKKEN') her skal DATABASEBLOKKEN erstattes med navnet på din blok i formen
Avatar billede littlehelper Nybegynder
23. maj 2002 - 13:10 #13
det er jeg klar over..... det med Go_block...... og jeg er godt klar over det ikke er en komplet løsning.... mener selv at jeg har skiftet de ting der skulle skiftes......

men jeg kan ikke se udfra din kode hvor der bliver henvist til min column på skærmen...!!!!!!!
Avatar billede i3448 Nybegynder
23. maj 2002 - 13:29 #14
-- i variablen herunder (line_no_fld) gemmes blocknavn og feltnavn
-- i dit tilfæde skal LINE_NO erstattes med ID
:global.line_no_fld := :system.cursor_block || '.LINE_NO';
-- linien herunder gemmes den ønskede værdi i feltet som er refereret
-- i variablen :global.line_no_fld
-- den ønskede værdi var i mit tilfælde nummeret på den record jeg
-- står i (:system.cursor_record) det kunne i stedet være en anden
-- variable eller en konstant
copy(:system.cursor_record,:global.line_no_fld);
Avatar billede littlehelper Nybegynder
23. maj 2002 - 13:52 #15
ehh.... hmmm.....

så skulle jeg have gjort det rigtig nok.... men det virker ikk....

men jeg vil gerne sige mange mange tak for din hjælp :)))) jeg må desværre nok prøve at finde på en knapt så smart løsning....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester