Projekat

Općenito

Profil

Akcije

Nove funkcije #31487

Zatvoren

TSQLBrowse klasa unutar F18 - TEST

Dodano od Saša Vranić prije skoro 13 godina. Izmjenjeno prije više od 12 godina.

Status:
Zatvoreno
Prioritet:
Visok
Odgovorna osoba:
Saša Vranić
Početak:
27.08.2013
Završetak:
% završeno:

100%

Procjena vremena:
Akcije #1

Izmjenjeno od Saša Vranić prije skoro 13 godina

već sam ranije spominjao da sam vidio ovu klasu u contrib folderu harboura

tsqlbrw.prg

Akcije #2

Izmjenjeno od Saša Vranić prije skoro 13 godina

Akcije #3

Izmjenjeno od Saša Vranić prije skoro 13 godina

Napravio

F18TableBrowse klasu

F18TableBrowse

Akcije #4

Izmjenjeno od Saša Vranić prije skoro 13 godina

i evo primjer korištenja... u pitanju je tabela fmk.roba

primjer funkcija

Akcije #5

Izmjenjeno od Saša Vranić prije skoro 13 godina

6000 stavki dobijemo u djeliću sekunde

Akcije #6

Izmjenjeno od Saša Vranić prije skoro 13 godina

e sad, to je čisti browse

ovdje sada trebaju sve funkcije za obradu podataka, pretragu, filtere itd...

Akcije #7

Izmjenjeno od Saša Vranić prije skoro 13 godina

  • Naslov promijenjeno iz TSQLBrowse klasa unutar F18 u TSQLBrowse klasa unutar F18 - TEST
Akcije #8

Izmjenjeno od Ernad Husremović prije skoro 13 godina

  • Vrsta promijenjeno iz Podrška u Nove funkcije
Akcije #9

Izmjenjeno od Saša Vranić prije više od 12 godina

napravio sam obradu tipki u browse-u...

recimo

  • ctrl + T (briši zapis)
  • ctrl + F9 (briši sve zapise)

sada se idem pozabaviti sa unos/ispravka podataka

naime, ovdje sada imamo jednu situaciju:

1) browse ne mora da pokazuje sve kolone tabele, nego samo ono što je selektom odabrano

2) kada editujemo neki zapis trebali bi da vidimo sva aktivna polja za unos

Akcije #10

Izmjenjeno od Saša Vranić prije više od 12 godina

u FMK je to radilo na način,

zadajemo matricu sa poljima i karakteristikama i to je ono što će se prikazati u browse-u i editovati također

Akcije #11

Izmjenjeno od Saša Vranić prije više od 12 godina

commit

evo jedan veliki update ...

radio sam čitav dan na unos/ispravka/pretraga itd...

Akcije #12

Izmjenjeno od Saša Vranić prije više od 12 godina

kod unosa novog zapisa treba ono da se pozicionira na njega kada se napravi novi zapis... nisam skontao kako to

Akcije #13

Izmjenjeno od Saša Vranić prije više od 12 godina

pretraga je napravljena po svakom polju ali se ne koristi pretraga kroz oQuery objekat nego se rade upiti

znači, stanem na polje ID pritisnem "F" i pretražujem polje

  • ako unesem "102" tražit će upravo takav zapis
  • ako unesem "102%" radit će LIKE svih zapisa ...
  • ako unesem "103;22%;51%; radit će egzaktnu pretragu prvog i like za dva ostala
Akcije #14

Izmjenjeno od Saša Vranić prije više od 12 godina

najveća petljancija je oko GET-ova kod unosa/ispravke, tu sam se namučio

također recimo i SIFK tabela ostala nepovezana !

Akcije #15

Izmjenjeno od Saša Vranić prije više od 12 godina

itd... itd... ima još posla kamara, ali ide dobro

Akcije #16

Izmjenjeno od Saša Vranić prije više od 12 godina

commit

dodao i

  • F5 - refresh / vraćanje u originalno stanje tabele
  • ALT+R - traži/zamjeni sa
  • pozicioniranje nakon dodavanja zapisa / ovo je glupa array funkcija koja traži zapis po tabeli... pa je posporo na većem broju zapisa, ali šta je tu je
  • CTRL+P - štampanje browse-a, kakvo takvo

invertovao BOX kao i klasični šifrarnici, dodao u vrh info o tabeli i da se radi o TSQLBrowse

dodao i one opcije na dnu...

Akcije #17

Izmjenjeno od Saša Vranić prije više od 12 godina

dodao i

  • F4 - dupliciranje zapisa
Akcije #18

Izmjenjeno od Saša Vranić prije više od 12 godina

ostaje još da se vidi ta veza sa SIFK :( tu ima isto dosta posla...

Akcije #19

Izmjenjeno od Saša Vranić prije više od 12 godina

skontao sam jednu divnu stvar, a to su return vrijednosti komandi INSERT, DELETE

pogledaj strukturu

tako da u svakom momentu imam podataka o tome

  • koji je podatak insertovan
  • koji je napravljen update
  • itd...
Akcije #20

Izmjenjeno od Saša Vranić prije više od 12 godina

  • Status promijenjeno iz Novo u Dodijeljeno
  • Prioritet promijenjeno iz Normalan u Visok
Akcije #21

Izmjenjeno od Saša Vranić prije više od 12 godina

kalkulator na sh+F1

commit

Akcije #22

Izmjenjeno od Saša Vranić prije više od 12 godina

iščitavanje SIFV podataka

commit

Akcije #23

Izmjenjeno od Saša Vranić prije više od 12 godina

update sifv podataka

commit

Akcije #24

Izmjenjeno od Saša Vranić prije više od 12 godina

napravio sam i ostale opcije browse-a kao što su

  • zabranjene opcije / restricted_keys
  • header
  • footer ispis
  • itd...
Akcije #25

Izmjenjeno od Saša Vranić prije više od 12 godina

postoji jedna interesantna stvar a to je da smo do sada kod browsa uvijek baratali sa tabelama, tako da ako imamo


// redovi
postoji_sifra( ..., {|| key_handler() })

function key_handler()

  do case 
      case Ch = K_F2
          ? field->idtipdok + field->brdok

  endcase 
return

e sada će situacija biti malo drugačija...

praktično sada kada inicijalizujemo browsesql objekat


// redovi
_br := sql_browse( ..., {|| key_handler( @_br:current_row ) })

....

function key_handler( curr_row )

  do case 
      case Ch = K_F2
          // ovdje sada možemo koristiti _br:curRow

          ? curr_row:FieldGet( curr_row:curRow:FieldPos("idtipdok")) ....

  endcase 
return

Akcije #26

Izmjenjeno od Saša Vranić prije više od 12 godina

Akcije #27

Izmjenjeno od Saša Vranić prije više od 12 godina

ovo podvlačenje je sporno ostalo, ono da stavimo da neko polje bude druge boje itd...

Akcije #28

Izmjenjeno od Saša Vranić prije više od 12 godina

test

Akcije #29

Izmjenjeno od Saša Vranić prije više od 12 godina

Danas puni dan rađene kontrole...

Povratne vrijednosti objeta TBrowseSQL, commit

F4 opcija, dupliciranje šifre - korekcija SIFV vrijednosti za novo polje commit

Modifikacije na TBrowseSQL i F18SQLBrowse objektima da se ponašaju kao i ObjDbEdit()

commit

znači, poziv šifrarnika, sa tačkom, sa dvije tačke itd...

Definisanje kolona kod F18SqlBrowse objekta commit

Akcije #30

Izmjenjeno od Saša Vranić prije više od 12 godina

kodni blok za šifrarnik

// 
// otvaranje šifrarnika artikala, kao što je to sada P_ROBA( @id )
//
//
function open_articles( id, x_pos, y_pos )

local oBr := F18TableBrowse():new()

// definisanje kolona
// 
// oBr:browse_columns[ naziv_za_ispis, dužina, naziv_polja_iz_tabele, {|| when_block }, {|| valid_block } ]
//
AADD( oBr:browse_columns, { "Šifra", 10, "id", {|| .t. }, {|| .t. } } )
AADD( oBr:browse_columns, { "Naziv", 40, "naz" } ) // vidimo da when i valid blokovi nisu obavezni
AADD( oBr:browse_columns, { "JMJ", 3, "jmj" } )
AADD( oBr:browse_columns, { "Cijena", 12, "mpc" } )
// itd...

// definisanje parametara browse-a
// ref: https://github.com/knowhow/F18_knowhow/blob/master/common/table_browse_sql.prg#L70
// ovdje možemo vidjeti sve parametre box-a
// 
oBr:browse_params["form_height"] := MAXROWS() - 15   // visina box-a
oBr:browse_params["form_width"] := MAXCOLS() - 15    // sirina box-a
oBr:browse_params["table_name"] := "fmk.roba"       // naziv sql tabele (sa shemom)
oBr:browse_params["table_order_field"] := {"id"}      // indeksno polje
oBr:browse_params["table_browse_return_field"] := "id"  // polje koje služi za povratnu vrijednost
oBr:browse_params["key_fields"] := { "id", "naz" }    // ključna polja, uvijek za šifrarnik idu 2
                                                         služi za indeksiranje i za ispise itd...    
oBr:browse_params["codes_type"] := .t.  // da se zna da je riječ o tip-u tabele šifrarnik
oBr:browse_params["read_sifv"] := .t.   // čitaj SIFV podatke zajedno sa postojećim podacima šifrarnika
oBr:browse_params["restricted_keys"] := NIL    // zabranjene tipke, inače se proslijeđuje matrica sa postavkama
                                                  { K_F2, K_ESC, ... }

// prikazivanje box-a
oBr:show( @id, x_pos, y_pos )

return .t.

što se tiče parametara browse-a ima ih dosta... ref: ::initialize()

ono što gore nije definisano:

oBr:browse_params["table_filter"] := {"id = '25'", "vpc = 2.0", ... } // koristi se niz...
oBr:browse_params["direct_sql"] := NIL // ovdje možemo definisati skroz jedinstven upit i taj će biti korišten 
oBr:browse_params["user_functions"] := NIL // navodi se kao {|| key_handler( @oBr:current_row ) }
oBr:browse_params["header_text"] := ""  // tekst koji će se pojaviti na vrhu box-a
oBr:browse_params["footer_text"] := ""  // tekst koji će se pojaviti na dnu box-a
oBr:browse_params["invert_row_block"] := NIL  // ovo je ostalo nerješeno, a odnosi se na podvlačenje tj. drugi PICT za red

kodni blok za browse proizvoljne tabele


// 
// pregled dokumenata
//

function browse_fakt_documents()
local oBr := F18TableBrowse():New()
local _qry
local _params

// ... otvori parametre za pregled
_params := get_params(...)

// na osnovu params sastavi upit
_qry := " SELECT idfirma, idtipdok, brdok ... " 
        " FROM fmk.fakt_doks " 
        " LEFT JOIN ..... " 
        " WHERE " + _params[1] + " AND " + _params[2] ..... 
        " ORDER xyx " 

// definisanje kolona
AADD( oBr:browse_columns, { "Firma", 2, "idfirma", {|| .t. }, {|| .t. } } )
AADD( oBr:browse_columns, { "TD", 2, "idtipdok" } ) // vidimo da when i valid blokovi nisu obavezni
AADD( oBr:browse_columns, { "Broj", 8, "broj" } )
AADD( oBr:browse_columns, { "Partner", 6, "idpartner" } )
// itd...

// definisanje parametara browse-a
oBr:browse_params["form_height"] := MAXROWS() - 15  
oBr:browse_params["form_width"] := MAXCOLS() - 15   
oBr:browse_params["table_name"] := "fmk.fakt_doks"     
oBr:browse_params["table_order_field"] := {"idfirma", "idtipdok", "brook"}     
oBr:browse_params["key_fields"] := { "idfirma", "idtipdok", "brdok" }  
oBr:browse_params["direct_sql"] := _qry 
oBr:browse_params["user_functions"] := {|| key_handler( @oBr:current_row ) 
oBr:browse_params["key_options"] := {"<c+N novi>", "<c+F> Traži", ... } // opcije na dnu forme
oBr:browse_params["key_options_column_count"] := 5  // broj kolona u koliko će biti raspoređene opcije
}                                                         

// prikazivanje box-a
oBr:show()

return

// obrada unosa korisničih tipki
static function key_handler( row )

do case
     case Ch == K_CTRL_N
        MsgBeep( row:FieldGet(1) ) // prikazat ce vrijednost prvog polja

endcase

return DE_CONT
Akcije #31

Izmjenjeno od Saša Vranić prije više od 12 godina

Akcije #32

Izmjenjeno od Saša Vranić prije više od 12 godina

treba provjeriti i funkcije koje bi se izvršavale na samom browse-u u kolonama... kako će to funkcionisati

Akcije #33

Izmjenjeno od Saša Vranić prije više od 12 godina

Akcije #34

Izmjenjeno od Saša Vranić prije više od 12 godina

definicija kolone, uvedena dva nova parametra

oBr:browse_columns = 
         { column_name, column_lenght, column_edit_field_name, { when_block }, { valid_block }, is_editable, is_visible }

definisanje kolona, u primjeru:

primjer

Akcije #35

Izmjenjeno od Saša Vranić prije više od 12 godina

još niz izmjena na tsqlbrowse

commit

Akcije #36

Izmjenjeno od Saša Vranić prije više od 12 godina

recimo, koristio sam delete metodu za brisanje zapisa, ali problem postoji kod JOIN-ovanih tabela, tu ne možemo koristiti, pa sam napravio ovakvu implementaciju

prvo se pokušava koristiti metoda delete samog browse objekta, pa ako ne uspije onda se pravi ekstra upit

primjer

Akcije #37

Izmjenjeno od Saša Vranić prije više od 12 godina

  • Status promijenjeno iz Dodijeljeno u Zatvoreno
  • % završeno promijenjeno iz 0 u 100

ovaj tiket se može zatvoriti, sve osnovne funkcije su ubačene, ali se na klasi radi još...

Akcije

Također dostupno kao Atom PDF