|
[ salvaric @ 11.07.2011. 22:39 ] @
| Pozdrav svima,
imam jedan mali problem sa funkcijom KontrolniBroj(). Hoću da napravim funkciju za proveru kont. broja tekućeg računa pomoću modela 97.
Napravio sam mali testni programčić koji funkcioniše kako treba:
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Math;
{$R *.dfm}
Function KontrolniBroj(Model:Integer;Tekst:String):String;
var
x: Variant;
begin
x:=(StrToInt64(Tekst)*100/model)-(StrToInt64(Tekst)*100 div model);
x:=RoundTo(x,-2);
x:=model+1-RoundTo(model*x,-1);
x:=Round(x);
Result:=VarToStr(x);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=KontrolniBroj(97,Edit1.Text);
end;
end.
To sve radi kako treba u tom programčiću, izračuna pravilno kontrolni broj,
porblem nastaje kada tu funkciju ubacim u neki drugi projekat i primenim, tad neće da radi kako treba, vraća pogrešan broj.
Dva sata sam izgubio tražeći rešenje enigme, al uzalud.
Dal neko možda zna u čemu je problem?
|
[ ((BugA)) @ 12.07.2011. 10:11 ] @
Gde si deklarisao funkciju KontrolniBroj()? Ne verujem da to moze biti razlog pogresne racunice, ali mi nije jasno ni kako te kompajler uopste pusta da kompajliras program... :/
Probaj da deo koda:
Code: var
Form1: TForm1;
implementation
... promenis u:
Code: var
Form1: TForm1;
Function KontrolniBroj(Model:Integer; Tekst:String): String;
implementation
Ako i dalje imas problema, postavi i kompletan kod drugog projekta (u kome koristis funkciju KontrolniBroj()), da vidimo da nije tu negde problem. Meni na prvi pogled ovo ostalo izgleda u redu. Verovatno je u pitanju neki trivijalan problem, iskustvo nas uci da takvi umeju da zadaju najvise muka :)
[ salvaric @ 12.07.2011. 16:27 ] @
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, ADODB, dbcgrids, StdCtrls, DBCtrls,
Mask, ThemeDBGrid, DBCtrlsEh, DBLookupEh, ComCtrls, Buttons,math;
type
TRealCekova = class(TForm)
ADOCekovi: TADOQuery;
DataCekovi: TDataSource;
ADOCekoviIDCeka: TAutoIncField;
ADOCekoviSerijskiBr: TWideStringField;
ADOCekoviIDBanke: TIntegerField;
ADOCekoviDPrijema: TDateTimeField;
ADOCekoviDDospeca: TDateTimeField;
ADOCekoviIznos: TFloatField;
ADOCekoviRealizovano: TBooleanField;
ADOBanke: TADOQuery;
ADOConnection1: TADOConnection;
ADOBankeIDBanke: TAutoIncField;
ADOBankeBanka: TWideStringField;
ADORadnje: TADOQuery;
ADORadnjeIDRadnje: TAutoIncField;
ADORadnjeRadnja: TWideStringField;
ADORadnjeAdresa: TWideStringField;
ADORadnjeMesto: TWideStringField;
ADOCekoviBanka: TStringField;
ADOCekoviRadnja: TStringField;
ThemeDBGrid1: TThemeDBGrid;
GroupBox1: TGroupBox;
DataRadnje: TDataSource;
DataBanke: TDataSource;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Radnja: TDBLookupComboboxEh;
Banka: TDBLookupComboboxEh;
SerBroj: TEdit;
DatumPrijema: TDateTimePicker;
DatumDospeca: TDateTimePicker;
ADOCekoviDRealizacije: TDateTimeField;
NerCekovi: TCheckBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
DatumReal: TDateTimePicker;
CheckBox1: TCheckBox;
ADOCekoviIDRadnje: TIntegerField;
ADORadnjeIDGrupe: TIntegerField;
ADOCekoviTekuciRN: TWideStringField;
ADOBankeTekuciRN: TWideStringField;
Button1: TButton;
procedure SerBrojChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure ThemeDBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ThemeDBGrid1DblClick(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure ThemeDBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
RealCekova: TRealCekova;
Function KontrolniBroj(Model:Integer; Tekst:String): String;
function IsDate(str: string): Boolean;
implementation
uses Unit2, Unit3;
{$R *.dfm}
[b]
Function KontrolniBroj(Model:Integer;Tekst:String):String;
var
x: Variant;
begin
x:=(StrToInt64(Tekst)*100/model)-(StrToInt64(Tekst)*100 div model);
x:=RoundTo(x,-2);
x:=model+1-RoundTo(model*x,-1);
x:=Round(x);
Result:=VarToStr(x);
end;
[/b]
function IsDate(str: string): Boolean;
var
dt: TDateTime;
begin
Result := True;
try
dt := StrToDate(str);
except
Result := False;
MessageDlg('Datum koji ste uneli nije ispravan. Pokušajte ponovo!',mtError,[mbOK],0);
end;
end;
procedure TRealCekova.SerBrojChange(Sender: TObject);
begin
CheckBox1.Enabled:=not NerCekovi.Checked;
if not CheckBox1.Enabled then
CheckBox1.Checked:=false;
DatumReal.Enabled:=CheckBox1.Enabled;
if CheckBox1.Enabled then
DatumReal.Enabled:=CheckBox1.Checked;
//if CheckBox1.Checked then
begin
DatumPrijema.Enabled:=not CheckBox1.Checked;
DatumDospeca.Enabled:=not CheckBox1.Checked;
end;
with ADOCekovi do
begin
Active:=false;
SQL.Clear;
SQL.Add('select * from tabCekovi');
SQL.Add('where SerijskiBr like "%'+SerBroj.Text+'%"');
if Radnja.Value <> null then
SQL.Add('and IDRadnje like "'+IntToStr(Radnja.Value)+'"');
if Banka.Value <> null then
SQL.Add('and IDBanke like "'+IntToStr(Banka.Value)+'"');
if NerCekovi.Checked then
SQL.Add(' and Realizovano<>True');
if CheckBox1.Checked then
begin
SQL.Add(' and DRealizacije=:DRealizacije');
Parameters.ParamByName('DRealizacije').Value:=DateToStr(DatumReal.Date);
end
else
begin
SQL.Add(' and DPrijema>=:DPrijema');
SQL.Add(' and DDospeca<=:DDospeca');
Parameters.ParamByName('DDospeca').Value:=DateToStr(DatumDospeca.Date);
Parameters.ParamByName('DPrijema').Value:=DateToStr(DatumPrijema.Date);
end;
Prepared:=true;
Open;
end;
end;
procedure TRealCekova.FormCreate(Sender: TObject);
begin
ADOConnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ExtractFilePath(Application.ExeName)+'\baza.mdb;Mode=Share Deny None';
ADOConnection1.Open;
DatumPrijema.Date:=StrToDate('01.01.'+FormatDateTime('yyyy',Date));
DatumReal.Date:=Now;
DatumDospeca.Date:=Now;
SystemParametersInfo(SPI_SETBEEP, 0, nil, SPIF_SENDWININICHANGE);
end;
procedure TRealCekova.FormActivate(Sender: TObject);
begin
SerBrojChange(self);
end;
procedure TRealCekova.BitBtn1Click(Sender: TObject);
var
Datum:String;
begin
if not ADOCekovi.IsEmpty then
begin
if MessageDlg('Sigurno želite realizovati čekove koji se nalaze na spisku?',mtInformation,[mbCancel,mbOK],1) = idok then
begin
Datum:=DateToStr(Now);
if InputQuery('Upit','Unesite datum na koji zelite realizovati čekove:',Datum) then
if IsDate(Datum) then
begin
ADOCekovi.First;
while not ADOCekovi.Eof do
begin
if ADOCekoviRealizovano.Value = false then
begin
ADOCekovi.Edit;
ADOCekoviRealizovano.Value:=true;
ADOCekoviDRealizacije.Value:=StrToDate(Datum);
ADOCekovi.Post;
end;
ADOCekovi.Next;
end;
MessageDlg('PROGRAM JE AUTOMATSKI REALIZOVAO SAMO ONE ČEKOVE KOJI NISU BILI REALIZOVANI A NALAZILI SU SE NA OVOM SPISKU.',mtConfirmation,[mbOK],1);
NerCekovi.Checked:=false;
CheckBox1.Checked:=True;
DatumReal.Date:=StrToDate(datum);
NerCekovi.OnClick(sender);
if MessageDlg('Želite li štampati specifikaciju?',mtInformation,[mbYes,mbNo],0) = idYes then
BitBtn2Click(Sender);
end;
end;
end;
end;
procedure TRealCekova.BitBtn2Click(Sender: TObject);
begin
if not ADOCekovi.IsEmpty then
begin
with form3.ADOR do
begin
Active:=false;
SQL.Clear;
SQL.Add('select DISTINCT IDRadnje from tabCekovi');
SQL.Add('where SerijskiBr like "%'+SerBroj.Text+'%"');
if Radnja.Value <> null then
SQL.Add('and IDRadnje like "'+IntToStr(Radnja.Value)+'"');
if Banka.Value <> null then
SQL.Add('and IDBanke like "'+IntToStr(Banka.Value)+'"');
if NerCekovi.Checked then
SQL.Add(' and Realizovano<>True');
if CheckBox1.Checked then
begin
SQL.Add(' and DRealizacije=:DRealizacije');
Parameters.ParamByName('DRealizacije').Value:=DateToStr(DatumReal.Date);
end
else
begin
SQL.Add(' and DPrijema>=:DPrijema');
SQL.Add(' and DDospeca<=:DDospeca');
Parameters.ParamByName('DDospeca').Value:=DateToStr(DatumDospeca.Date);
Parameters.ParamByName('DPrijema').Value:=DateToStr(DatumPrijema.Date);
end;
Prepared:=true;
Open;
end;
with Form3.ADOCek do
begin
Close;
SQL.Clear;
SQL.Add(ADOCekovi.SQL.GetText);
SQL.Add('and IDRadnje = :IDRadnje');
if CheckBox1.Checked then
Parameters.ParamByName('DRealizacije').Value:=DateToStr(DatumReal.Date)
else
begin
Parameters.ParamByName('DDospeca').Value:=DateToStr(DatumDospeca.Date);
Parameters.ParamByName('DPrijema').Value:=DateToStr(DatumPrijema.Date);
end;
Prepared:=true;
end;
form3.Data.DataSet:=Form3.ADOR;
Form3.ADOCek.DataSource:=Form3.Data;
Form3.ADOCek.Open;
Form3.QuickRep.Preview;
end;
end;
procedure TRealCekova.BitBtn3Click(Sender: TObject);
begin
ADOCekovi.Append;
ADOCekoviRealizovano.Value:=false;
if radnja.Value<>Null then
ADOCekoviIDRadnje.Value:=Radnja.Value;
if ADDStavke.ShowModal=IDOK then
ADOCekovi.Post
else
ADOCekovi.Cancel;
end;
procedure TRealCekova.BitBtn5Click(Sender: TObject);
begin
if not ADOCekovi.IsEmpty then
begin
if MessageDlg('Sigurno želite izbrisati selektovanu stavku?',mtConfirmation,[mbYes,mbNo],0) = idyes then
ADOCekovi.Delete;
end;
end;
procedure TRealCekova.BitBtn4Click(Sender: TObject);
begin
if not ADOCekovi.IsEmpty then
begin
ADOCekovi.Edit;
ADOCekoviRealizovano.Value:=false;
if ADDStavke.ShowModal=IDOK then
ADOCekovi.Post
else
ADOCekovi.Cancel;
end;
end;
procedure TRealCekova.ThemeDBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
VK_DELETE:BitBtn5Click(Sender);
VK_RETURN:BitBtn4Click(sender);
VK_INSERT:BitBtn3Click(sender);
end;
end;
procedure TRealCekova.ThemeDBGrid1DblClick(Sender: TObject);
begin
BitBtn4Click(sender);
end;
procedure TRealCekova.CheckBox1Click(Sender: TObject);
begin
DatumReal.Enabled:= not NerCekovi.Checked;
end;
procedure TRealCekova.FormShow(Sender: TObject);
begin
ADOCekovi.Open;
end;
procedure TRealCekova.ThemeDBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (gdSelected in State) or (gdFocused in State) then
Begin
ThemeDBGrid1.Canvas.Brush.Color := $0006E6B9;
ThemeDBGrid1.Canvas.Font.Color := clBlack;
ThemeDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column, State);
end;
end;
[b]
procedure TRealCekova.Button1Click(Sender: TObject);
begin
ShowMessage(KontrolniBroj(97,SerBroj.Text));
end;
[/b]
end.
Pokušao sam na razne načine da skontam u čemu je džidža al neće.
Kreiram novi program, iskopiram funkciju i radi kako treba, al kad ubacim u stari program tu ne fercera. daje neke približne vrednosti al nikako pravu, tipa umesto 46 daje 50, 24 daje 25 i tako dalje.
[ salvaric @ 12.07.2011. 20:45 ] @
Malo sam izmenuo funkciju i testirao događaje:
Code:
function TRealCekova.KontrolniBroj(Model: Integer; Tekst: String): String;
var
x: Variant;
begin
x:=(StrToInt64(Tekst)*100/model)-(StrToInt64(Tekst)*100 div model);
Memo1.Lines.Add(VarToStr(x));
x:=RoundTo(x,-2);
Memo1.Lines.Add(VarToStr(x));
x:=model+1-RoundTo(model*x,-1);
Memo1.Lines.Add(VarToStr(x));
x:=Round(x);
Memo1.Lines.Add(VarToStr(x));
Result:=VarToStr(x);
end;
Dodam u funkciju zapis svake promene da zabilježi u Memo1, izaberem žiro račun 1650000000006822 i šta se desi? Testni program da sledeći rezultat:
0,5361328125
0,54
45,6
46
dok u starom programu:
0,5
0,5
49,5
50
Ne znam šta je, al mislim da je u pitanju neka mala sitnica al je ne mogu odgonetnut.
[ savkic @ 12.07.2011. 20:58 ] @
> Ne znam šta je, al mislim da je u pitanju neka mala sitnica al je ne mogu odgonetnut.
Pusti kod iz debuggera, tako ćeš najlakše naći. Inače evo koda za računanje kontrolnog broja po modulu 97.
Code:
function Mod97(const ABroj: string): string;
var
Temp: string;
Broj: string;
i: Smallint;
Ostatak: 0..96;
begin
Broj := UpperCase(ABroj);
for i := 1 to Length(Broj) do
begin
case Broj[i] of
'A'..'Z': Temp := Temp + IntToStr(Ord(Broj[i]) - 55); // Slova se zamenjuju brojevima 10..35
'0'..'9': Temp := Temp + Broj[i];
end;
end;
Temp := Temp + '00';
Ostatak := StrMod(Temp, 97);
Result := FormatIntLen(98 - Ostatak , 2);
end;
function StrMod(const ABroj: string; const ADenumerator: Smallint): Integer;
var
Temp: string;
BrojCifara: Smallint;
TempNumerator: Integer;
begin
Temp := ABroj;
BrojCifara := Length(IntToStr(ADenumerator)) + 1;
repeat
TempNumerator := StrToIntDef(Copy(Temp, 1, BrojCifara), 0); // (1) korak
Result := TempNumerator mod ADenumerator; // (2) korak
Temp := IntToStr(Result) + Copy(Temp, BrojCifara + 1, Length(Temp) - BrojCifara); // (3) korak
until Temp = IntToStr(Result);
end;
function FormatIntLen(const AValue: Int64; const ALen: Smallint; const APadChar: Char = '0'): string;
begin
if AValue >= 0 then
Result := FormatStrLen(IntToStr(AValue), ALen, APadChar)
else // Kod negativnih brojeva moramo se postarati da minus bude na pocetku
Result := '-' + FormatStrLen(IntToStr(AValue * -1), ALen - 1, APadChar);
end;
function FormatStrLen(const AValue: string; const ALen: Smallint; const APadChar: Char = ' '): string;
begin
Result := StringOfChar(APadChar, ALen - Length(AValue)) + Copy(AValue, 1, ALen);
end;
[Ovu poruku je menjao savkic dana 12.07.2011. u 22:27 GMT+1]
[ salvaric @ 12.07.2011. 21:11 ] @
Izvini, al kod mene neće da radi funkcija FormatIntLen().
//Result := FormatIntLen(98 - Ostatak,2);
Koju biblioteku koristi?
[ savkic @ 12.07.2011. 21:30 ] @
> Izvini, al kod mene neće da radi funkcija FormatIntLen().
> //Result := FormatIntLen(98 - Ostatak,2);
> Koju biblioteku koristi?
Moju ;) Zaboravio sam da pošaljem, evo sad sam dodao.
[ salvaric @ 12.07.2011. 21:44 ] @
Hvala ti puno!
Sa tvojom funkciom sam rešio problem.
Code:
procedure TRealCekova.BitBtn2Click(Sender: TObject);
begin
if not ADOCekovi.IsEmpty then
begin
with form3.ADOR do
begin
Active:=false;
SQL.Clear;
SQL.Add('select DISTINCT IDRadnje from tabCekovi');
SQL.Add('where SerijskiBr like "%'+SerBroj.Text+'%"');
if Radnja.Value <> null then
SQL.Add('and IDRadnje like "'+IntToStr(Radnja.Value)+'"');
if Banka.Value <> null then
SQL.Add('and IDBanke like "'+IntToStr(Banka.Value)+'"');
if NerCekovi.Checked then
SQL.Add(' and Realizovano<>True');
if CheckBox1.Checked then
begin
SQL.Add(' and DRealizacije=:DRealizacije');
Parameters.ParamByName('DRealizacije').Value:=DateToStr(DatumReal.Date);
end
else
begin
SQL.Add(' and DPrijema>=:DPrijema');
SQL.Add(' and DDospeca<=:DDospeca');
Parameters.ParamByName('DDospeca').Value:=DateToStr(DatumDospeca.Date);
Parameters.ParamByName('DPrijema').Value:=DateToStr(DatumPrijema.Date);
end;
Prepared:=true;
Open;
end;
with Form3.ADOCek do
begin
Close;
SQL.Clear;
SQL.Add(ADOCekovi.SQL.GetText);
SQL.Add('and IDRadnje = :IDRadnje');
if CheckBox1.Checked then
Parameters.ParamByName('DRealizacije').Value:=DateToStr(DatumReal.Date)
else
begin
Parameters.ParamByName('DDospeca').Value:=DateToStr(DatumDospeca.Date);
Parameters.ParamByName('DPrijema').Value:=DateToStr(DatumPrijema.Date);
end;
Prepared:=true;
end;
form3.Data.DataSet:=Form3.ADOR;
Form3.ADOCek.DataSource:=Form3.Data;
Form3.ADOCek.Open;
Form3.QuickRep.Preview;
end;
end;
Kreirao sam novu aplikaciju i kopirao procedure i funkcije jednu po jednu i porblem je nastao kad sam iskopirao tu proceduru, tad funkcija vraća drugu vrednost.
Neću više da se natežem sa tim, rešio sam porblem.
Još jednom hvala na pomoći!!!!
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|