Jump to content

emileverh

Members
  • Content Count

    79
  • Joined

  • Last visited

  • Days Won

    2

Posts posted by emileverh


  1. The final solution is different than proposed. I did not know but the SUM() function can return NULL values. So on larger datasets I did get 'WideString'!!! conversion error messages on SQLite. So I had to use IFNULL.

    May be not for all the most elegant solution. But this TFDQUERY works now for both MySQL and SQLite

     

    select IFNULL(SUM(AmountValue),0) AS SumVal
    from camtentries

     

    And in the code:

     

    var mycurr: currency := qryMyQuery.FieldByName('SumValue').Value;

     

    Normally I don't work with .FieldByName and .Value. I prefer this: 

     

    var mycurr: currency := qryMyQuerySumValue.AsCurrency;

     

    But know the app is not complaining. I have hundreds of queries, but only 2 SUM()'s. So I can live with that. I don't use them in a loop, so performance is not an issue. And I develop the app with MySQL. Because I can easy test my data together with HeidiSQL. The field names become also strange

    select IFNULL(SUM(AmountValue),0) AS "SumVal::DOUBLE:" will be  qryMyQuerySumValueDOUBLE.AsCurrency;

     

    Although the first answers where not the implemented one. I want to thank all the people in general on this forum. As solo entrepreneur I don't have a collegae to ask. So thank you all!  

    • Like 1

  2. 2 hours ago, emileverh said:

    Nice. But this is overwhelming, I don't see any practical info for me now....

    I am sorry! Yes it was a bit overwhelming, but you helped me. So thanks 😉 I have a direction now.

    The code as shown on the EMB website does not compile. With this code it compiles for both versions..... But I am losing data? The dtFloat type does not exist. I am accurate enough with this code? Please no discussions about the "with"-statements, I need to rewrite this....

     

    Thanks in advance!
     

      with qrySumPositive.FormatOptions.MapRules.Add do  // Need to add the .Add else it does not compile
      begin
        SourceDataType := dtDouble;  // <<<< THIS IS A GUESS. THE TYPE dtFLOAT DOES NOT EXISTS
        TargetDataType := dtFmtBCD;
      end;
      qrySumPositive.FormatOptions.OwnMapRules := true;
    
    
    
      with qrySumPositive do
      begin
        ParamByName('prmDateStart').AsDateTime := MyStartOfaDay(ADateStart);
        ParamByName('prmDateEnd').AsDateTime := MyEndOfaDay(ADateEnd);
        Open;
        Result := qrySumPositiveSumVal.AsCurrency;
        Close;
      end;
    

     


  3. Team!

     

    I have one large application which I compile twice, one is for MySQL and the other for SQLite. For regular queries like select * from everything goes fine. But it goes wrong with SUM() functions.

    The query defined in a TFDQuery below works fine in MySQL, but when I compile the application for SQLite I get an exception "Type mismatch for field 'SumVal', expecting: FMTBcd actual: Float'. "

     

    The definition of AmountValue in the database is:   AmountValue DECIMAL(13,4) NOT NULL

     

    And here is the query:

     

    select SUM(AmountValue) AS SumVal
    from camtentries


     

    Is there a property for this one and only TFDQuery or for the field qrySumPositiveSumVal.AsCurrency where it compiles fine in both applications? I prefer not to set an overall property in the TFDConnection.

     

    Thanks!!!

    -Emile


  4. 39 minutes ago, Remy Lebeau said:

    Use the Win32 SHFileOperation() API to copy the file with the FOF_RENAMEONCOLLISION flag:

     If you need to know what the copied filename was renamed to, include the FOF_WANTMAPPINGHANDLE flag as well:

    Alternatively, on Windows Vista+, you can use the IFileOperation API instead, using IFileOperation.SetOperationFlags() to set the FOF_RENAMEONCOLLISION flag, IFileOperation.CopyItem() and IFileOperation.PerformOperations() to perform the copy, and if needed use an IFileOperationProgressSink event sink to discover the copied filename in the PostCopyItem event.

    Thanks Remy for your help!!!


  5. Just now, Remy Lebeau said:

    You cannot delete a file that is in use, unless the app that is using the file explicitly permits the deletion (by specifying FILE_SHARE_DELETE when opening the file). Nobody does that under normal usage, so you will need to detect when this condition happens (check GetLastError() when the deletion fails) and then. either 1) retry the deletion later or 2) ask Windows to delete the file on the next reboot (via MoveFileEx(MOVEFILE_DELAY_UNTIL_REBOOT)).

    You are right force deleting a file is not a good idea. The other (unknown for me) process needs the file. Any idea if there is an API to add a kind of duplication number like: file (1).txt, file (2).txt, file (3).txt ? 

    I did Google something but I did not find 1-2-3 an API for that. Anybody knows?


  6. 17 minutes ago, Lajos Juhász said:

    You should check GetLastError to see the reason why it fails. https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-deletefile

     

    One of the possible reason is that the file doesn't exists and the other is that the file is in use by other application.

    Thanks and agree! I had to check if the file exists. But the DeleteFile() call was recently added. In previous versions of my app it failed on the next statement TFIle.Copy().  So again; is there a way to force delete a file? 


  7. Hi!

     

    I need to copy a file to the Windows-temp folder. But on some of my clients it fails. I can not reproduce it, but when they open a mail with attachment in Outlook and my app is working on the same filename it fails. The routine below fails.

     

    Please do not focus on Outlook, but in general. How can I 'force delete' a file? Or how can I safe save a file to the temp folder without problems? Any suggestions? Please help!  

    -Emile

    function TdtmBoot.CopyFileToTempFolder(const AFullFileName: TFileName): string;
    begin
      var lFileName: string := ExtractFileName(AFullFileName);
      var lTempFolderFullFileName: string := GetTempFolder + lFileName;
    
      try
        if DeleteFile(lTempFolderFullFileName) = False then; // @17.22
        begin
          SendMadBugReport(Self, 'CopyFileToTempFolder(), delete failed');  // <<<<<<<< HERE IT FAILS!!!!!!!
        end;
      except
      end;
    
      Result := lTempFolderFullFileName;
      try
        TFile.Copy(AFullFileName, lTempFolderFullFileName, true); // true = overwrite
        Result := lTempFolderFullFileName;
      except
      end;
    end;

     


  8. 8 hours ago, johnnydp said:

    Delphi suffers from lack of popularity and thus lack of adequate funding.

    Too many things at once (mac, linux, mobile, fmx, vcl, c++ builder).
    Ideally, it would be as if the company would choose some one way and focus all attention and power on it, increasing quality and performance. 
    Delphi needs:

    - Roadmap back!
    - Make finally 64 bit IDE, compiler, linker etc. with total abandon of 32 bit(do not wasting time on 32 bit version and focus on one)
    - performance (yes it matters all the time)
    - Improve the quality and speed of bug patching (it's a little better than e.g. 5 years ago, but it's still outrageously slow comparing e.g. to VStudio, where we get some update, hotfix etc. every few weeks.

    - Realise that developers need quality much more than new features (they don't understand it for over 25 years)

     

     

    Agree! Hotfixes and/or faster updates would be nice. Good quality goes above new features! 

    • Like 2

  9. 14 minutes ago, jeroenp said:

    The C# library Raptorious.Finance.Swift.Mt940 has been ported 5 years ago to .NET core at  https://github.com/mjebrahimi/SharpMt940Lib.Core/tree/master 

     

    I have used the raptorious one to successfully parse ABN AMRO MT940 files and convert them to CD at https://github.com/jpluimers/MT940-to-CSV

     

    It should be relatively straightforward to port them to Delphi. 

     

    --jeroen 

    Thanks!


  10. 15 hours ago, Lainkes said:

    I managed to loop with ControlCount.

     

    First I disable all controls on my panel.

    Then I enable my PageControl.

    And as last I loop all mu controls on my PageControl and set them disabled.

    
                // SET ALL COMPONENTS TO READONLY
                  // Disable first all components
                  for I := 0 to RzPanel1.ControlCount - 1 do
                    RzPanel1.Controls[I].Enabled := False;
                  // Enable TabSheets
                  PageControl1.Enabled := True;
                  // Disable components in PageControl
                  for I := 0 to PageControl1.ControlCount - 1 do
                    PageControl1.Controls[I].Enabled := False;

    Thanks for the help and hints.

     

    Alain

    Use GetControls() new since Delphi 11 I believe. Just as an example for me to disable TcxEdit's only. But you can do your own stuff:

    for var ctrl in frmMain.GetControls([ceftAll]) do
        begin
          if (ctrl is TcxEdit) then
          begin
            TcxEdit( ctrl).Enabled := false;
          end;
        end;

     

    • Thanks 1

  11. Hi guys!

    I am using D12. I have lots of code for ID’s like this:

     

    type TProductID = record

      ID : nativeint;

    end;

     

    What I want is this:

    type TProductID = nativeint;

     

    And yes I know the last declaration works! But when you make a call to a procedure and you mixed the params by mistake you got no error. Is there any helper, record attribute, compiler directive or so where I did not think of?!?!

     

    procedure TForm6.FormCreate(Sender: TObject);
    begin
      var tmpid: TProductID := 6;
      AddToStock(tmpid, 100);
      AddToStock(100, tmpid);  // I want a compiler warning or error here!!!!!!!
    end;

    procedure TForm6.AddToStock(pid: TProductID; cnt: nativeint);  // Both uses internally nativeint
    begin
      ShowMessage(pid.ToString);
    end;

     

    Now I have lot's(!) of database code like this in my program....

     

    var cid : TCustomerID;

    var pid: TProductID;

    pid.ID := qryGetStockProductID.AsInteger;

    cid.ID := qryGetStocCustID.AsInteger;

     

    What I want is:

    pid:= qryGetStockProductID.AsInteger;

    cid := qryGetStocCustID.AsInteger;

     


  12. Hi!

     

    I installed ICS 9.1 today, wowww I am impressed. The demos are very impressive, compliments to the author(s) 😉 But also overwhelming with so much functionality. 

     

    Can you give me a direction where to look for with what is the easiest way to find a MySQL server ( with port 3306 open) on my LAN (192.168.x.x)? 

     

    Thanks in advance, Emile


  13. 53 minutes ago, Vandrovnik said:

    In forward declaration of a class, compiler immediatelly knows the size of that type. For records, their size would be unknown in forward declaration.

    That can be true, but that is 'not my problem' how to solve it. I use records a lot for several reasons (speed, memory management,....). And it would be VERY nice to have that.  


  14. Just now, PeterBelow said:

    All components that have the form as Owner (which includes all components dropped on the form in the IDE designer) are automatically destroyed when the form is destroyed. So your query components are destroyed but whether that automatically releases serverside resources depends on how the component, especially its destructor, is implemented. But a TFDQuery will close the query when it is destroyed, so your scenario is OK.

    Thanks for the quick reply!!  😉


  15. 11 hours ago, Fred Ahrens said:

    I don't need any new features.

    I just need that the existing features work as intended. And there are many areas where existing features need to be made usable again (e.g. refactoring, code formatting, HighDPI).

     

    OK, one new feature would be nice: compiling for Raspberry Pi. But fixing the existing features needs to be done first.

    Totally agree. Fix the existing things first....

    • Like 1
×