[ popmilan76 @ 22.06.2015. 19:56 ] @
Kako pomocu Delphija i Access baze otvoriti Quuery napravljen u Access,i da se rezultat pokaze u dbgridu na formi u Delphiju...
[ savkic @ 22.06.2015. 20:18 ] @
Imas u jednoj od top tema ovde kako koristiti ADO u Delphiju, pogledaj i tu ces naci kako se uvezati na Access.
[ komplikator @ 24.06.2015. 06:58 ] @
Upravo tako, imaš negdje u top temama, imaš i početničku školu Žarka Gajića na: http://delphi.about.com/od/database/a/adodelphi.htm
[ popmilan76 @ 04.07.2015. 16:48 ] @
A da li mogu da pokrenem proceduru napravljenu u access iz delphija...
[ Rapaic Rajko @ 05.07.2015. 10:21 ] @
Pogledaj StoredProc, zaboravih kako to ide sa ADO-om.

Pozz
[ popmilan76 @ 05.07.2015. 15:38 ] @
Da,pogledao sam,ali slabo mi to nesto ide...Imam u access uradjen program za racunanje godisnjeg odmora,tj koliko ko ima odmora....Meni treba kod koji racuna to,dakle treba da mi razlika od danasnjeg dana do dana unosa,i plus staz do datuma unosa,s tim sto su mi danasnji dan,i dan unosa u formatu datuma,ali staz mi je u stringu,kao recimo 010225,sto pokazuje 1 godinu,2 meseca i 25 dana...
[ Rapaic Rajko @ 06.07.2015. 11:10 ] @
Koji deo je zapeo?

Pozz
[ popmilan76 @ 06.07.2015. 15:04 ] @
Kako da napravim sledece:
Imam polje koje mi je pretraga po prezimenu radnika,i to mi sljaka,ukucam pocetna slova i izbaci mi listu,gde sa dvoklikom izaberem nekoga,i ti podaci ostanu na formi...pored opstih podataka,imam jedan textbox,koji mi oznacava staz radnika u string formatu,recimo 1g,1m,21dan...Kako da dobijem taj podatak,cim izaberem radnika?U bazi imam polje string koje oznacava staz do trenutka unosa radnika,negde 2009 godine,kada je pravljen program....Dakl taj kod treba da sabere taj staz do unosa + do danasnjeg datuma i minus broj dana neplacenog odsustva...I da sve to bude u string formatu,dan,mesec ,godina...
[ savkic @ 06.07.2015. 22:27 ] @
Tesko je tu voditi staz u danima, najlakse da vodis u godinama, mesecima i danima pa da svaki od njih dodajes odvojeno dane, mesece i godine ili oduzmes. Verovatno je najbolje da vidis kako se to vodi u PIO fondu i da primenis isti taj algoritam.
[ popmilan76 @ 06.07.2015. 22:43 ] @
Nisam se dobro izrazio...meni i treba u godinama,mesecima i danima...samo mi pretstavlja problem ovo polje u stringu u bazi.....Ako moze za pocetak kako dane prebaciti u d,m,g...
[ savkic @ 07.07.2015. 10:32 ] @
Dakle iz stringa "1g,1m,21dan" treba da izvuces pojedinačne podatke?

Code:


function StrToken(var S: string; Separator: Char): string;
var
  I: Integer;
begin
  I := Pos(Separator, S);
  if I <> 0 then
  begin
    Result := Copy(S, 1, I - 1);
    Delete(S, 1, I);
  end
  else
  begin
    Result := S;
    S := '';
  end;
end;

function StringToInteger(AValue: string): Int64;
const
  AnsiDecDigits = ['0'..'9'];
  AnsiSigns     = ['-', '+'];
var
  i, b: Integer;
begin
  b := 1;
  for i := 1 to Length(AValue) do
  begin
  {$IFDEF DELPHIXE_UP}
    if CharInSet(AValue[i], AnsiDecDigits) or ((b = 1) and CharInSet(AValue[i], AnsiSigns)) then
  {$ELSE}
    if (AValue[i] in AnsiDecDigits) or ((b = 1) and (AValue[i] in AnsiSigns)) then
  {$ENDIF}
    begin
      AValue[b] := AValue[i];
      Inc(b);
    end;
  end;

  SetLength(AValue, b - 1);
  Val(AValue, Result, b);
end;


Sa ovim gore funkcijama možeš to lako završiti, npr:

Code:

[var
  Staz, Temp: string;
  God, Mes, Dan: Integer;
begin
  Staz := '1g,1m,21dan';
  Temp := StrToken(Staz, ',');
  God := StringToInteger(Temp);
  Temp := StrToken(Staz, ',');
  Mes := StringToInteger(Temp);
  Dan := StringToInteger(Staz);
end;

[ captPicard @ 07.07.2015. 13:43 ] @
Njemu je u formatu ggmmdd, znači ovako nekako:

Code:
var
  iGod, iMj, i Dan: integer;
begin

iGod := Copy(sString, 0, 2)


itd.

Makar ovo nije dobar pristup, ako je već tako napravljeno onda nemaš drugih opcija. Nemoj zaboraviti na kontrole, da netko ne bi ubacio 11011 umjesto 011011...
[ popmilan76 @ 07.07.2015. 22:16 ] @
Imam funkciju za racunanje razlike u datumima,i to u formatu godine,meseci i dani(i to bas ovako je u bazi,010101,1 godina,1 mesec i 1 dan).meni treba da ovoj razlici u datumima,koju imam,u formatu g,m,d...dodam string iz baze,ovo 010101.....Ne znam da li sam jasan....
[ savkic @ 07.07.2015. 22:49 ] @
Ne mozes sabirati stringove, staz koji ti je u stringu pretvori u normalan oblik (integer vrednosti) i onda primeni sabiranje.
[ popmilan76 @ 08.07.2015. 14:56 ] @
Imam proceduru za razliku izmedju dva datuma...to je ova....

procedure DateDiff(DateFrom, DateTo: TDateTime;
var Years, Months, Days: Integer);
var
Temp: TDateTime;
i: Integer;
begin
Years := 0;
Months := 0;
Days := 0;
i := 0;
Temp := DateFrom;
while Temp <= DateTo do
begin
Inc(i);
Temp := IncMonth(DateFrom, i);
end;
Years := i div 12;
Months := i mod 12;
// now this depends on what you want here..
// this will return number of whole days counting from time part of DateFrom
Days := Trunc(DateTo - IncMonth(Temp, -1));
// if you need days counted based on midnight...
// e.g. from Jan/1/2000 23:59 to Jan/2/2000 00:01 -> difference 1 day..
{Days := Trunc(DateTo) - Trunc(IncMonth(Temp, -1));}
end;


E,sada meni treba da na ovu razliku,koja je u g,m,d...dodam field koji je u stringu....

Na formu ,tj njegov event...sam stavio ovaj deo,gde pozivam ovu proceduru

datediff(datumunosa,danas,years,months,days);
frmgodisnjiodmori.Edit5.Text := IntToStr(years) + 'g' + IntToStr(Months) + 'm' + IntToStr(days) + 'd';


Gde na ove,years,months i days da dodam moje polje 010101....

Znam da ide integer i to nesto tipa left(string,0,2)...ali kako i gde da ga dodam postojecoj razlici....
[ Milan Milosevic @ 08.07.2015. 15:56 ] @
Unit DateUtils ima veliki broj funkcija za rad sa DataTime podatcima.
Nema potrebe da pravis svoje.
Dakle primeni prvo pristup koji je dao captPicard
da string konvertujes u word uz malu izmenu
Code:

var
  sgod,smes,sdan:String;
  Godina,mesec,dan,ProtekloDana:Word;
  Dt:TDatetime;
begin
  sgod := Copy(sString, 1, 2);
  smes := Copy(sString, 3, 2);
  sdan := Copy(sString, 5, 2);

  Godina:=Strtoint(sgod);
  mesec:=Strtoint(smes);
 dan:=Strtoint(sdan);
 if Godina > 50 then  Godina := 1900+Godina 
 else
   Godina := 2000+Godina; //ako je posle 2000 te

  //EncodeDateTime za prevodenje podatke u Tdatatime 
  Dt:=EncodeDateTime(Godina,mesec,dan,0,0,0,0);
 ProtekloDana:=DaysBetween(now,Dt); // odreduje broj dana izmedu sadacnjeg dana i dana iz stringa sString koji sadrzi datum iz tvoje baze
end;






[Ovu poruku je menjao Milan Milosevic dana 08.07.2015. u 17:55 GMT+1]
[ popmilan76 @ 08.07.2015. 17:31 ] @
Ne treba mi time,samo date...i ovo nesto ne ide...Da ponovim jos jednom....evo ovako....
U bazi imam polje staz,koje je string(010101),i imam polje datumunosa,koje je 26.06.2008 godine jer je tada pravljen program,a ovaj staz je staz do tog trenutka...i meni treba da izracunam koliko imam g,d.m od datumaunosa i plus staz znaci ovo 010101....Program sam nasledio,nisam ga ja pisao,to je nekome bilo lakse u access da uradi tako...
[ savkic @ 08.07.2015. 18:20 ] @
Ja ne znam kako bolje da objasnim, stringove ne mozes sabirati, string moras pretvoriti u odgovarajuce broje i onda sabirati. Poslao sam ti i funkcije kako da pretvoris string u brojeve a i drugi su to cinili, tvoj zadatak je da sednes i iskombinujes ta dve stvari a to je max dva sata posla, ne razumam sta ti je tu problem.
[ Milan Milosevic @ 08.07.2015. 18:39 ] @
Ok jasno mi je gde je tvoj problem.

[Ovu poruku je menjao Milan Milosevic dana 08.07.2015. u 20:43 GMT+1]
[ Milan Milosevic @ 08.07.2015. 19:41 ] @
Evo jos jedna procedura koja racuna godine, mesece i dane.
Po autoru uzima u obzir i prestupne godine.
POmocu ove funkcije dobices godine, mesece i dane izmedu danasnjeg dana ili nekog drugo koji ti treba i 26.06.2008.
Iz moje procedure izvuci ces godine, mesece i dane radnog staza do 26.06.2008.
i na kraju ces da ih saberes.
Ukoliko broj dana prelazi 30 ili 31? (Moras da pitas nekog pravnika kako se racuna staz)


Code:


procedure YearsMonthsWeeksDaysBetween(DateFrom, DateTo : TDate; Var YearsGap, MonthsGap, WeeksGap, DaysGap : Word);
var
DaysNumber,DaysCounter,DaysInAMonthCounter: Word;
YearsCount, MonthsCount, WeeksCount, DaysCount,DaysInCurrentMonth: Word;
TempDate : TDate;
begin

//Init Vars.
// Respresents: YearsGap, MonthsGap, WeeksGap, DaysGap
YearsCount:=0; MonthsCount:=0; WeeksCount:=0; DaysCount:=0; 

// Represents: The Days gap by two dates (In Days only) and Days Counter.
DaysCounter:=0; DaysNumber:=DaysBetween(DateFrom, DateTo);

// Represents: The current Month's number of days and Days counter (per a month)
DaysInCurrentMonth:=0; DaysInAMonthCounter:=0;

// Copy the DateFrom parameter for farther calculations
TempDate:=DateFrom;

// Update the number of days in current month
DaysInCurrentMonth:=DaysInMonth(TempDate);

// Actual Job -- Check on each day.
While DaysCounter < DaysNumber do
Begin
Inc(DaysCounter);
Inc(DaysInAMonthCounter);
Inc(DaysCount);
If DaysCount=7 Then
Begin
Inc(WeeksCount);
DaysCount:=0;
End;

// If you reach the end of a month, based on the number
// of days of the current month then
If (DaysInAMonthCounter = DaysInCurrentMonth) Then
Begin
Inc(MonthsCount);
WeeksCount:=0;
DaysCount:=0;

If MonthsCount=12 then
Begin
Inc(YearsCount);
MonthsCount:=0;
End;

// Add a month, based on the month's number of days, to DateFrom
TempDate:=TempDate+DaysInCurrentMonth; 

// Calculate the number of days of the next month
DaysInCurrentMonth:=DaysInMonth(TempDate);

// Start coung Month's days all over again.
DaysInAMonthCounter:=0;
End;

End;
End;



[Ovu poruku je menjao Milan Milosevic dana 09.07.2015. u 06:04 GMT+1]
[ Milan Milosevic @ 08.07.2015. 20:20 ] @
Ovo bi trebalo da radi valjano

Code:

procedure TForm1.Button1Click(Sender: TObject);
var
  sgod,smes,sdan,sString:String;
  Godina,mesec,nedelja,dan,ProtekloDana:Word;
  iGod,imes,idan:Integer;
  Dt,PocDate:TDate;
begin
  sString:=Edit1.Text; // string iz baze
  sgod := Copy(sString, 1, 2);
  smes := Copy(sString, 3, 2);
  sdan := Copy(sString, 5, 2);

  Godina:=Strtoint(sgod);
  mesec:=Strtoint(smes);
  dan:=Strtoint(sdan);

  PocDate:=EncodeDate(2008,06,6); // datum kada je uneta zadnja izmena
 {Odredujemo datum od kada je poceo da se racuna radni staz}
  PocDate:=IncDay(PocDate,-dan);
  PocDate:=IncMonth(PocDate,-mesec);
  PocDate:=IncYear(PocDate,-Godina);
  Dt:= Today; // datum do koda prracunavamo novi radni staz Uzimamo danas
  DateDiff(PocDate,Dt,iGod,imes,idan); // trazimo razliku izmedu dva datuma OVA FUNKCIJA NE VRACA PRAVILNO BROJ MESECI
  ShowMessage('Radni staz iznosi '+Inttostr(idan)+' dana, '+Inttostr(imes-1)+'meseci ,  '+Inttostr(iGod)+' godina');
end;
[ popmilan76 @ 08.07.2015. 22:27 ] @
Evo ovako,jasno mi je da ne mogu sabirati stringove,nije tu problem....Ja cak napravim i razliku izmedju dva datuma u formatima,g,m,d....ali kada iz onog stringa izdvojim ,recimo mesece.....dobijam,recimo 19 meseci,sto je 1 godina i 7 meseci,isto tako i za dane....
[ savkic @ 09.07.2015. 00:18 ] @
> ali kada iz onog stringa izdvojim ,recimo mesece.....dobijam,recimo 19 meseci,sto je 1 godina i 7 meseci,isto tako i za dane....

Tu je samo problem sa danima, moraš videti koji je zvaničan algoritam (PIO fond je tu merodavan) za sabiranje dana i da li je npr. 35 dana, 1m i 4d ili 1m i 5d.
[ popmilan76 @ 09.07.2015. 08:39 ] @
Mesec mi racuna kao 30 dana...
[ popmilan76 @ 09.07.2015. 09:18 ] @
Uspeo sam,hvala svima...