DbCrossF.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:10k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit DbCrossF;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Db, DBTables, StdCtrls, ComCtrls;
  6. type
  7.   TDbCrossForm = class(TForm)
  8.     TableCustomers: TTable;
  9.     TableOrders: TTable;
  10.     TableItems: TTable;
  11.     BtnGenerate: TButton;
  12.     DataSource1: TDataSource;
  13.     TableCustomersCustNo: TFloatField;
  14.     TableCustomersCompany: TStringField;
  15.     TableCustomersAddr1: TStringField;
  16.     TableCustomersAddr2: TStringField;
  17.     TableCustomersCity: TStringField;
  18.     TableCustomersState: TStringField;
  19.     TableCustomersZip: TStringField;
  20.     TableCustomersCountry: TStringField;
  21.     TableCustomersPhone: TStringField;
  22.     TableCustomersFAX: TStringField;
  23.     TableCustomersTaxRate: TFloatField;
  24.     TableCustomersContact: TStringField;
  25.     TableCustomersLastInvoiceDate: TDateTimeField;
  26.     DataSource2: TDataSource;
  27.     TableOrdersOrderNo: TFloatField;
  28.     TableOrdersCustNo: TFloatField;
  29.     TableOrdersSaleDate: TDateTimeField;
  30.     TableOrdersShipDate: TDateTimeField;
  31.     TableOrdersEmpNo: TIntegerField;
  32.     TableOrdersShipToContact: TStringField;
  33.     TableOrdersShipToAddr1: TStringField;
  34.     TableOrdersShipToAddr2: TStringField;
  35.     TableOrdersShipToCity: TStringField;
  36.     TableOrdersShipToState: TStringField;
  37.     TableOrdersShipToZip: TStringField;
  38.     TableOrdersShipToCountry: TStringField;
  39.     TableOrdersShipToPhone: TStringField;
  40.     TableOrdersShipVIA: TStringField;
  41.     TableOrdersPO: TStringField;
  42.     TableOrdersTerms: TStringField;
  43.     TableOrdersPaymentMethod: TStringField;
  44.     TableOrdersItemsTotal: TCurrencyField;
  45.     TableOrdersTaxRate: TFloatField;
  46.     TableOrdersFreight: TCurrencyField;
  47.     TableOrdersAmountPaid: TCurrencyField;
  48.     TableItemsOrderNo: TFloatField;
  49.     TableItemsItemNo: TFloatField;
  50.     TableItemsPartNo: TFloatField;
  51.     TableItemsQty: TIntegerField;
  52.     TableItemsDiscount: TFloatField;
  53.     EditPath: TEdit;
  54.     Label1: TLabel;
  55.     TableParts: TTable;
  56.     TableItemsPart: TStringField;
  57.     TablePartsPartNo: TFloatField;
  58.     TablePartsVendorNo: TFloatField;
  59.     TablePartsDescription: TStringField;
  60.     TablePartsOnHand: TFloatField;
  61.     TablePartsOnOrder: TFloatField;
  62.     TablePartsCost: TCurrencyField;
  63.     TablePartsListPrice: TCurrencyField;
  64.     ButtonMain: TButton;
  65.     ButtonCross: TButton;
  66.     BtnPath: TButton;
  67.     ProgressBar1: TProgressBar;
  68.     procedure BtnGenerateClick(Sender: TObject);
  69.     procedure ButtonMainClick(Sender: TObject);
  70.     procedure ButtonCrossClick(Sender: TObject);
  71.     procedure BtnPathClick(Sender: TObject);
  72.     procedure FormCreate(Sender: TObject);
  73.   end;
  74. var
  75.   DbCrossForm: TDbCrossForm;
  76. implementation
  77. {$R *.DFM}
  78. {$WARN UNIT_PLATFORM OFF}
  79. uses
  80.   Shellapi, HtmlData, FileCtrl;
  81. // partial version (with no cross reference)
  82. {procedure TDbCrossForm.BtnGenerateClick(Sender: TObject);
  83. var
  84.   HtmlCust, HtmlOrd, HtmlItem: THtmlData;
  85. begin
  86.   // initialize
  87.   Screen.Cursor := crHourglass;
  88.   ProgressBar1.Max := TableCustomers.RecordCount;
  89.   // create the string lists
  90.   HtmlCust := THtmlData.Create (TableCustomers);
  91.   HtmlOrd := THtmlData.Create (TableOrders);
  92.   HtmlItem := THtmlData.Create (TableItems);
  93.   try
  94.     // the main file (customers)
  95.     HtmlCust.AddHeader ('All the Customers');
  96.     // for each customer
  97.     TableCustomers.First;
  98.     while not TableCustomers.EOF do
  99.     begin
  100.       // add a row to the html customers table,
  101.       // linked with the orders of the customer
  102.       HtmlCust.AddTableRow ('Cust');
  103.       // create an order file for each customer
  104.       HtmlOrd.AddHeader (TableCustomersCompany.AsString +
  105.         ' Orders');
  106.       // for each order of the current customer
  107.       TableOrders.First;
  108.       while not TableOrders.EOF do
  109.       begin
  110.         // add the data of the order file,
  111.         // linked with the items of each order
  112.         HtmlOrd.AddTableRow ('Ord');
  113.         // create an item file for each order
  114.         HtmlItem.AddHeader (
  115.           TableCustomersCompany.AsString + ' Order No. ' +
  116.           TableOrders.FieldByName('OrderNo').AsString);
  117.         // for each item of the current order
  118.         while not TableItems.EOF do
  119.         begin
  120.           // add the data of the current item
  121.           // (with no further links)
  122.           HtmlItem.AddTableRow ('');
  123.           TableItems.Next;
  124.         end;
  125.         // save the html file with the items of the order
  126.         HtmlItem.AddFooter;
  127.         HtmlItem.SaveToFile (EditPath.Text + 'Ord' +
  128.           TableOrders.FieldByName('OrderNo').AsString +
  129.           '.htm');
  130.         TableOrders.Next;
  131.       end;
  132.       // save the html file with the orders of the customer
  133.       HtmlOrd.AddFooter;
  134.       HtmlOrd.SaveToFile (EditPath.Text + 'Cust' +
  135.         TableCustomersCustNo.AsString + '.htm');
  136.       TableCustomers.Next;
  137.       // update the UI
  138.       ProgressBar1.Position := TableCustomers.RecNo;
  139.       Application.ProcessMessages;
  140.     end;
  141.     // save the main file with the list of customers
  142.     HtmlCust.AddFooter;
  143.     HtmlCust.SaveToFile (EditPath.Text + 'main.htm');
  144.   finally
  145.     HtmlCust.Free;
  146.     HtmlOrd.Free;
  147.     HtmlItem.Free;
  148.     Beep;
  149.     Screen.Cursor := crDefault;
  150.   end;
  151. end;}
  152. // complete version (with cross reference)
  153. procedure TDbCrossForm.BtnGenerateClick(Sender: TObject);
  154. var
  155.   HtmlCust, HtmlOrd, HtmlItem, HtmlParts: THtmlData;
  156.   HtmlMem: THtmlStrings;
  157.   ListOfLists: TStringList;
  158.   Index: Integer;
  159. begin
  160.   // initialize
  161.   Screen.Cursor := crHourglass;
  162.   ProgressBar1.Max := TableCustomers.RecordCount;
  163.   // create the string lists
  164.   HtmlCust := THtmlData.Create (TableCustomers);
  165.   HtmlOrd := THtmlData.Create (TableOrders);
  166.   HtmlItem := THtmlData.Create (TableItems);
  167.   HtmlParts := THtmlData.Create (TableParts);
  168.   ListOfLists := TStringList.Create;
  169.   try
  170.     // the main file (customers)
  171.     HtmlCust.AddHeader ('All the Customers');
  172.     // for each customer
  173.     TableCustomers.First;
  174.     while not TableCustomers.EOF do
  175.     begin
  176.       // add a row to the html customers table,
  177.       // linked with the orders of the customer
  178.       HtmlCust.AddTableRow ('Cust');
  179.       // create an order file for each customer
  180.       HtmlOrd.AddHeader (TableCustomersCompany.AsString +
  181.         ' Orders');
  182.       // for each order of the current customer
  183.       TableOrders.First;
  184.       while not TableOrders.EOF do
  185.       begin
  186.         // add the data of the order file,
  187.         // linked with the items of each order
  188.         HtmlOrd.AddTableRow ('Ord');
  189.         // create an item file for each order
  190.         HtmlItem.AddHeader (
  191.           TableCustomersCompany.AsString + ' Order No. ' +
  192.           TableOrders.FieldByName('OrderNo').AsString);
  193.         // for each item of the current order
  194.         while not TableItems.EOF do
  195.         begin
  196.           // add the data of the current item
  197.           // (with no further links)
  198.           HtmlItem.AddTableRow ('');
  199.           // look for the part number in the cross
  200.           // reference files in memory
  201.           Index := ListOfLists.IndexOf (
  202.             TableItemsPartNo.AsString);
  203.           // if not found, create a new entry
  204.           if Index < 0 then
  205.           begin
  206.             // create a new string list for this part
  207.             HtmlMem := THtmlStrings.Create;
  208.              HtmlMem.AddHeader ('Part: ' +
  209.               TableItemsPart.AsString);
  210.             // add it to the main list of parts
  211.             Index := ListOfLists.AddObject (
  212.               TableItemsPartNo.AsString, HtmlMem);
  213.           end;
  214.           // in any case, add a new reference to the
  215.           // (existing or new) string list for this part
  216.           THtmlStrings (ListOfLists.Objects[Index]).
  217.             Add ('<a href="Ord' +
  218.               TableItemsOrderNo.AsString + '.htm">' +
  219.               TableCustomersCompany.AsString +
  220.               ' Order No. ' +
  221.               TableOrders.FieldByName('OrderNo').AsString +
  222.               '</a><p>');
  223.           TableItems.Next;
  224.         end;
  225.         // save the html file with the items of the order
  226.         HtmlItem.AddFooter;
  227.         HtmlItem.SaveToFile (EditPath.Text + 'Ord' +
  228.           TableOrders.FieldByName('OrderNo').AsString +
  229.           '.htm');
  230.         TableOrders.Next;
  231.       end;
  232.       // save the html file with the orders of the customer
  233.       HtmlOrd.AddFooter;
  234.       HtmlOrd.SaveToFile (EditPath.Text + 'Cust' +
  235.         TableCustomersCustNo.AsString + '.htm');
  236.       TableCustomers.Next;
  237.       // update the UI
  238.       ProgressBar1.Position := TableCustomers.RecNo;
  239.       Application.ProcessMessages;
  240.     end;
  241.     // save the main file with the list of customers
  242.     HtmlCust.AddFooter;
  243.     HtmlCust.SaveToFile (EditPath.Text + 'main.htm');
  244.     // save each file of the cross reference
  245.     for Index := 0 to ListOfLists.Count - 1 do
  246.     begin
  247.       HtmlMem := THtmlStrings (ListOfLists.Objects[Index]);
  248.       HtmlMem.AddFooter;
  249.       HtmlMem.SaveToFile (EditPath.Text + 'Itx' +
  250.         ListOfLists [Index] + '.htm');
  251.       HtmlMem.Free;
  252.     end;
  253.     // generate the index of the cross reference
  254.     HtmlParts.AddHeader ('Parts Cross Reference');
  255.     TableParts.First;
  256.     while not TableParts.EOF do
  257.     begin
  258.       // add a row to the html customers table
  259.       HtmlParts.AddTableRow ('Itx');
  260.       TableParts.Next;
  261.     end;
  262.     HtmlParts.AddFooter;
  263.     HtmlParts.SaveToFile (EditPath.Text +
  264.       'Parts.htm');
  265.   finally
  266.     HtmlCust.Free;
  267.     HtmlOrd.Free;
  268.     HtmlItem.Free;
  269.     HtmlParts.Free;
  270.     ListOfLists.Free;
  271.     Beep;
  272.     Screen.Cursor := crDefault;
  273.   end;
  274. end;
  275. procedure TDbCrossForm.ButtonMainClick(Sender: TObject);
  276. begin
  277.   // open the main file with the default browser
  278.   ShellExecute (Handle, 'open',
  279.     pChar (EditPath.Text + 'main.htm'),
  280.     '', '', sw_ShowNormal);
  281. end;
  282. procedure TDbCrossForm.ButtonCrossClick(Sender: TObject);
  283. begin
  284.   // open the main file with the default browser
  285.   ShellExecute (Handle, 'open',
  286.     pChar (EditPath.Text + 'parts.htm'),
  287.     '', '', sw_ShowNormal);
  288. end;
  289. procedure TDbCrossForm.BtnPathClick(Sender: TObject);
  290. var
  291.   SelDir: string;
  292. begin
  293.   SelDir := EditPath.Text;
  294.   if SelectDirectory (SelDir,
  295.       [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
  296.     EditPath.Text := SelDir + '';
  297. end;
  298. procedure TDbCrossForm.FormCreate(Sender: TObject);
  299. begin
  300.   EditPath.Text := ExtractFilePath (Application.Exename);
  301. end;
  302. end.