Delphi Can
Matematiksel İşlem - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Matematiksel İşlem (/showthread.php?tid=6667)



Matematiksel İşlem - apachi2006 - 19-03-2022

Database den çektiğimiz string bir formülümüz var. 
Bu formülümüz genislik*yukseklik diyelim. 
Hesaplama esnasında bu formülü çekerek, baska bir tablodan genislik ve yukseklik (float) değerini alıp hesaplama sonucunun çıktısını nasıl alırız?


Normal şartlarda ;

var sformul:string;
mgenislik,myukseklik,mformul:double;
begin
mgenislik:=1500 ;
myukseklik:=1500 ;
sformul:='mgenislik*myukseklik/1000000'; //burdaki formülü tablodan alıp,
mformul:= mgenislik*myukseklik/1000000;  buraya aktararak hesaplama nasıl yapabiliriz?
sedit1.Text:= floattostr(mformul);
end;


Matematiksel İşlem - frmman - 19-03-2022

https://github.com/Crownie88/Delphi-mathematic-expression-parser/blob/master/MathExpParser.pas


Cvp: Matematiksel İşlem - bydelphi - 19-03-2022

(19-03-2022, Saat: 15:35)apachi2006 Adlı Kullanıcıdan Alıntı: Database den çektiğimiz string bir formülümüz var. 
Bu formülümüz genislik*yukseklik diyelim. 
Hesaplama esnasında bu formülü çekerek, baska bir tablodan genislik ve yukseklik (float) değerini alıp hesaplama sonucunun çıktısını nasıl alırız?


Normal şartlarda ;

var sformul:string;
mgenislik,myukseklik,mformul:double;
begin
mgenislik:=1500 ;
myukseklik:=1500 ;
sformul:='mgenislik*myukseklik/1000000'; //burdaki formülü tablodan alıp,
mformul:= mgenislik*myukseklik/1000000;  buraya aktararak hesaplama nasıl yapabiliriz?
sedit1.Text:= floattostr(mformul);
end;



Alternatif olarak veritabanından formül ve parametreleri çekerken Execute Statement ile de çözebilirsin.

Ben sql Server da örneklendirdim, kullandığın veritabanına göre kod değişebilir.


[attachment=1994]


Cvp: Matematiksel İşlem - apachi2006 - 19-03-2022

(19-03-2022, Saat: 17:46)frmman Adlı Kullanıcıdan Alıntı: https://github.com/Crownie88/Delphi-mathematic-expression-parser/blob/master/MathExpParser.pas

Math sınıfı ekli olmasına rağmen pas dosyasında  94:Stack[0] := Power(Stack[1], Stack[0]);// Power  bu satırda hata veriyor.
Kullanımı konusunda bilgi verebilir misiniz?

(19-03-2022, Saat: 19:00)bydelphi Adlı Kullanıcıdan Alıntı:
(19-03-2022, Saat: 15:35)apachi2006 Adlı Kullanıcıdan Alıntı: Database den çektiğimiz string bir formülümüz var. 
Bu formülümüz genislik*yukseklik diyelim. 
Hesaplama esnasında bu formülü çekerek, baska bir tablodan genislik ve yukseklik (float) değerini alıp hesaplama sonucunun çıktısını nasıl alırız?


Normal şartlarda ;

var sformul:string;
mgenislik,myukseklik,mformul:double;
begin
mgenislik:=1500 ;
myukseklik:=1500 ;
sformul:='mgenislik*myukseklik/1000000'; //burdaki formülü tablodan alıp,
mformul:= mgenislik*myukseklik/1000000;  buraya aktararak hesaplama nasıl yapabiliriz?
sedit1.Text:= floattostr(mformul);
end;



Alternatif olarak veritabanından formül ve parametreleri çekerken Execute Statement ile de çözebilirsin.

Ben sql Server da örneklendirdim, kullandığın veritabanına göre kod değişebilir.


Kod:
procedure TForm8.sBitBtn1Click(Sender: TObject);
var mgenislik,myukseklik:double;
begin
UniConnection1.Connected:=true;
UniQuery1.Active:=true;
qrecete.Active:=true;
mgenislik:=1500 ;
myukseklik:=1500 ;
UniQuery1.SQL.Clear;
UniQuery1.SQL.add('declare @formul varchar(100)');
UniQuery1.SQL.add('set @formul = genislik*yukseklik');
UniQuery1.SQL.add('set @formul = replace(@formul,genislik,mgenislik');
UniQuery1.SQL.add('set @formul = replace(@formul,yukseklik,myukseklik');
UniQuery1.SQL.add('set @formul = select +@formul+sonuc');
UniQuery1.SQL.add('exec(@formul)');
ShowMessage(UniQuery1sonuc.Text);

mgenislik ve myukseklik yerine değer verirsek sonuç döndürüyor, ama string değişimi yaptığı için değer döndürmüyor.


Cvp: Matematiksel İşlem - bydelphi - 19-03-2022

(19-03-2022, Saat: 19:19)apachi2006 Adlı Kullanıcıdan Alıntı:
(19-03-2022, Saat: 17:46)frmman Adlı Kullanıcıdan Alıntı: https://github.com/Crownie88/Delphi-mathematic-expression-parser/blob/master/MathExpParser.pas

Math sınıfı ekli olmasına rağmen pas dosyasında  94:Stack[0] := Power(Stack[1], Stack[0]);// Power  bu satırda hata veriyor.
Kullanımı konusunda bilgi verebilir misiniz?

(19-03-2022, Saat: 19:00)bydelphi Adlı Kullanıcıdan Alıntı: Alternatif olarak veritabanından formül ve parametreleri çekerken Execute Statement ile de çözebilirsin.

Ben sql Server da örneklendirdim, kullandığın veritabanına göre kod değişebilir.


Kod:
procedure TForm8.sBitBtn1Click(Sender: TObject);
var mgenislik,myukseklik:double;
begin
UniConnection1.Connected:=true;
UniQuery1.Active:=true;
qrecete.Active:=true;
mgenislik:=1500 ;
myukseklik:=1500 ;
UniQuery1.SQL.Clear;
UniQuery1.SQL.add('declare @formul varchar(100)');

UniQuery1.SQL.add('set @formul = replace(@formul,genislik,mgenislik');
UniQuery1.SQL.add('set @formul = replace(@formul,yukseklik,myukseklik');
UniQuery1.SQL.add('set @formul = select +@formul+sonuc');
UniQuery1.SQL.add('exec(@formul)');
ShowMessage(UniQuery1sonuc.Text);

mgenislik ve myukseklik yerine değer verirsek sonuç döndürüyor, ama string değişimi yaptığı için değer döndürmüyor.


Sql server session ortamında varchar bir değişkene tırnak içerisinde değer atamanız gerekir.
string işlemleri için şöyle deneyin 

UniQuery1.SQL.add(  'set @formul = '+QuotedStr('genislik*yukseklik')  );

bu kod ile sql session ortamına string değişkenizin tırnak içerisisinde gidecek.
bunu diğer satırlarada uygulayın


Cvp: Matematiksel İşlem - apachi2006 - 19-03-2022

(19-03-2022, Saat: 20:05)bydelphi Adlı Kullanıcıdan Alıntı:
(19-03-2022, Saat: 19:19)apachi2006 Adlı Kullanıcıdan Alıntı: Math sınıfı ekli olmasına rağmen pas dosyasında  94:Stack[0] := Power(Stack[1], Stack[0]);// Power  bu satırda hata veriyor.
Kullanımı konusunda bilgi verebilir misiniz?



Kod:
procedure TForm8.sBitBtn1Click(Sender: TObject);
var mgenislik,myukseklik:double;
begin
UniConnection1.Connected:=true;
UniQuery1.Active:=true;
qrecete.Active:=true;
mgenislik:=1500 ;
myukseklik:=1500 ;
UniQuery1.SQL.Clear;
UniQuery1.SQL.add('declare @formul varchar(100)');

UniQuery1.SQL.add('set @formul = replace(@formul,genislik,mgenislik');
UniQuery1.SQL.add('set @formul = replace(@formul,yukseklik,myukseklik');
UniQuery1.SQL.add('set @formul = select +@formul+sonuc');
UniQuery1.SQL.add('exec(@formul)');
ShowMessage(UniQuery1sonuc.Text);

mgenislik ve myukseklik yerine değer verirsek sonuç döndürüyor, ama string değişimi yaptığı için değer döndürmüyor.


Sql server session ortamında varchar bir değişkene tırnak içerisinde değer atamanız gerekir.
string işlemleri için şöyle deneyin 

UniQuery1.SQL.add(  'set @formul = '+QuotedStr('genislik*yukseklik')  );

bu kod ile sql session ortamına string değişkenizin tırnak içerisisinde gidecek.
bunu diğer satırlarada uygulayın

Kod:
UniConnection1.Connected:=true;
UniQuery1.Active:=true;
qrecete.Active:=true;
sformul:= qreceteformul.Text;
genislik:=1500 ;
yukseklik:=1500 ;
UniQuery1.SQL.Clear;
UniQuery1.SQL.add('declare @formul varchar(100)');
UniQuery1.SQL.add('set @formul = '+QuotedStr(sformul));  //genislik*yukseklik
UniQuery1.SQL.add('set @formul = replace(@formul,genislik,strtofloat(genislik)');
UniQuery1.SQL.add('set @formul = replace(@formul,yukseklik,strtofloat(yukseklik)');
UniQuery1.SQL.add('set @formul = select +@formul+sonuc');
UniQuery1.SQL.add('exec(@formul)');
ShowMessage(UniQuery1sonuc.Text);

Replace yapılan yerdeki genislik yerine string genislik değilde 1500 olan genişlik değerinin gelmesi gerekiyor.


Cvp: Matematiksel İşlem - bydelphi - 19-03-2022

(19-03-2022, Saat: 20:31)apachi2006 Adlı Kullanıcıdan Alıntı:
(19-03-2022, Saat: 20:05)bydelphi Adlı Kullanıcıdan Alıntı: Sql server session ortamında varchar bir değişkene tırnak içerisinde değer atamanız gerekir.
string işlemleri için şöyle deneyin 

UniQuery1.SQL.add(  'set @formul = '+QuotedStr('genislik*yukseklik')  );

bu kod ile sql session ortamına string değişkenizin tırnak içerisisinde gidecek.
bunu diğer satırlarada uygulayın

Kod:
UniConnection1.Connected:=true;
UniQuery1.Active:=true;
qrecete.Active:=true;
sformul:= qreceteformul.Text;
genislik:=1500 ;
yukseklik:=1500 ;
UniQuery1.SQL.Clear;
UniQuery1.SQL.add('declare @formul varchar(100)');
UniQuery1.SQL.add('set @formul = '+QuotedStr(sformul));  //genislik*yukseklik
UniQuery1.SQL.add('set @formul = replace(@formul,genislik,strtofloat(genislik)');
UniQuery1.SQL.add('set @formul = replace(@formul,yukseklik,strtofloat(yukseklik)');
UniQuery1.SQL.add('set @formul = select +@formul+sonuc');
UniQuery1.SQL.add('exec(@formul)');
ShowMessage(UniQuery1sonuc.Text);

Replace yapılan yerdeki genislik yerine string genislik değilde 1500 olan genişlik değerinin gelmesi gerekiyor.


Hangi veritabanını kullanıyorsunuz Sql Server Mı


Cvp: Matematiksel İşlem - frmman - 19-03-2022

(19-03-2022, Saat: 19:19)apachi2006 Adlı Kullanıcıdan Alıntı:
(19-03-2022, Saat: 17:46)frmman Adlı Kullanıcıdan Alıntı: https://github.com/Crownie88/Delphi-mathematic-expression-parser/blob/master/MathExpParser.pas

Math sınıfı ekli olmasına rağmen pas dosyasında  94:Stack[0] := Power(Stack[1], Stack[0]);// Power  bu satırda hata veriyor.
Kullanımı konusunda bilgi verebilir misiniz?


Şu şekilde kullanabilirsiniz.


uses
 MathExpParser;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 xx: TExpressionParser;
 sonuc: double;
 denklem: string;
 x, y: integer;
begin

 xx := TExpressionParser.Create();

 denklem := 'X+Y+5';

 x := 30;
 y := 50;
 denklem := StringReplace(denklem, 'X', x.ToString, [rfReplaceAll, rfIgnoreCase]);
 denklem := StringReplace(denklem, 'Y', y.ToString, [rfReplaceAll, rfIgnoreCase]);

 sonuc := xx.ParseExpressionToFloat(denklem);
 edit1.Text := denklem;  // 30+50+5
 edit2.Text := sonuc.ToString; // sonuç 85

 xx.Free;
end;



Cvp: Matematiksel İşlem - apachi2006 - 20-03-2022

(19-03-2022, Saat: 23:03)frmman Adlı Kullanıcıdan Alıntı:
(19-03-2022, Saat: 19:19)apachi2006 Adlı Kullanıcıdan Alıntı: Math sınıfı ekli olmasına rağmen pas dosyasında  94:Stack[0] := Power(Stack[1], Stack[0]);// Power  bu satırda hata veriyor.
Kullanımı konusunda bilgi verebilir misiniz?


Şu şekilde kullanabilirsiniz.


uses
 MathExpParser;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 xx: TExpressionParser;
 sonuc: double;
 denklem: string;
 x, y: integer;
begin

 xx := TExpressionParser.Create();

 denklem := 'X+Y+5';

 x := 30;
 y := 50;
 denklem := StringReplace(denklem, 'X', x.ToString, [rfReplaceAll, rfIgnoreCase]);
 denklem := StringReplace(denklem, 'Y', y.ToString, [rfReplaceAll, rfIgnoreCase]);

 sonuc := xx.ParseExpressionToFloat(denklem);
 edit1.Text := denklem;  // 30+50+5
 edit2.Text := sonuc.ToString; // sonuç 85

 xx.Free;
end;

Teşekkürler