Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kontrolni broj, problem?

[es] :: Pascal / Delphi / Kylix :: Kontrolni broj, problem?

[ Pregleda: 2983 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
...148.91.adsl.dyn.beotel.net.



+4 Profil

icon Kontrolni broj, problem?11.07.2011. u 22:39 - pre 154 meseci
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?



Nikad izvini!
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.static.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Kontrolni broj, problem?12.07.2011. u 10:11 - pre 154 meseci
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 :)
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
...148.91.adsl.dyn.beotel.net.



+4 Profil

icon Re: Kontrolni broj, problem?12.07.2011. u 16:27 - pre 154 meseci
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.
Nikad izvini!
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
...148.91.adsl.dyn.beotel.net.



+4 Profil

icon Re: Kontrolni broj, problem?12.07.2011. u 20:45 - pre 154 meseci
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.

Nikad izvini!
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kontrolni broj, problem?12.07.2011. u 20:58 - pre 154 meseci
> 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]
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
...148.91.adsl.dyn.beotel.net.



+4 Profil

icon Re: Kontrolni broj, problem?12.07.2011. u 21:11 - pre 154 meseci
Izvini, al kod mene neće da radi funkcija FormatIntLen().
//Result := FormatIntLen(98 - Ostatak,2);
Koju biblioteku koristi?
Nikad izvini!
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kontrolni broj, problem?12.07.2011. u 21:30 - pre 154 meseci
> 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.
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
...148.91.adsl.dyn.beotel.net.



+4 Profil

icon Re: Kontrolni broj, problem?12.07.2011. u 21:44 - pre 154 meseci
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!!!!

Nikad izvini!
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Kontrolni broj, problem?

[ Pregleda: 2983 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.