【问题标题】:Insert partly existing data插入部分现有数据
【发布时间】:2013-04-10 12:53:08
【问题描述】:

我需要在按钮单击时将额外数据添加到底部显示的 TEMP 表中。 我需要复制和插入表中所有现有的 FROM - TO - DAYS。 RATE_PRICE 将是预先确定的,并且对于所有新插入(插入时)都是相同的。 并且还插入了。

示例:我要加一张床,需要 15 欧元。 现在我想,当我选中一个复选框(并单击一个按钮)以在 TEMP 表中插入该值(15)但 它必须遵循网格中显示的日期值。 我想在名为 EXTRA 的 TEMP 表中添加额外的字段,除非 复选框选中。因此,当我检查添加加床的选项时,加床将按照显示的价格。房价价格将是 15 然后... 日期。

如何插入所需的数据?

更新

我在点击按钮时做到了:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
with ABSQuery4 do begin
ABSQuery4.Close;
ABSQuery4.SQL.Clear;
ABSQuery4.SQL.Text := 'INSERT INTO TEMP (extra,Date_From,Date_To,Rate_price,Days,Total) VALUES (:a1,:a2,:a3,:a4,:a5,:a6)';
ABSquery4.Params.ParamByName('a1').asString :='TT';
ABSquery4.Params.ParamByName('a2').value := cxDateEdit1.date;
ABSquery4.Params.ParamByName('a3').value := cxDateEdit2.date;
ABSquery4.Params.ParamByName('a4').value :='1';
ABSquery4.Params.ParamByName('a5').value :=Daysbetween(cxDateEdit1.Date,cxDateEdit2.Date);
ABSquery4.Params.ParamByName('a6').value := (ABSquery4.Params.ParamByName('a4').value)*(ABSquery4.Params.ParamByName('a5').value);
 ABSquery4.ExecSQL ;
 ABSquery2.Refresh;
end;
end;

还有更优雅的方式吗?

【问题讨论】:

  • 好的。所以去做吧。你有什么问题?
  • 如何插入所需数据?
  • 你不能像插入任何其他数据一样插入它吗?我不明白这个问题。
  • 我需要复制数据 - 网格/日期中已经存在的数据),我可以将我的新内容附加到这些数据中。我需要日期....
  • @user763539 : 如果你已经有了价目表,为什么不使用呢?在您的代码中,您必须(比如说 50 个 Extras)创建相同数量的按钮。对于这些按钮中的每一个,您必须指定硬编码的价格。这不容易维护!只需更改价目表就更简单了。另一方面,您必须不惜一切代价重新编译您的程序!

标签: delphi delphi-xe2 delphi-2010 delphi-xe


【解决方案1】:

您应该新读者指出您指的是上一个问题(代码)。没有这些信息,他们无法理解您的问题。 Hotel prices spanning multiple dates issue

现在回答你的问题。

忘记你的with absquery4 do begin,有一个更简单的方法。
只需在现有代码中添加 2 行新代码。

  • 将您的价目表扩展到您需要的所有附加功能。
  • 例如DBLMSExtraBed : '价格:15,00`。
  • 添加新的按钮标题:='Add Extras`。
  • clickEvent 指向您的 CalculationButtonClick。
  • 在触发事件的按钮的 CalculationButtonClick 中进行测试。
  • DBLMSExtraBed 填写ROOM_TYPE TEdit 字段。
  • 添加以下 WITH .. IF .. THEN

...

with sender As TButton do if name='DoCalc'  then begin

上面

ABSQuery2.Close;
ABSQuery2.SQL.Text:='DELETE from TEMP';
ABSQuery2.ExecSQL;
ABSQuery2.SQL.Text:='SELECT * from TEMP ORDER BY ID ';
ABSQuery2.Open;

结束;

end;

如果事件是从 AddExtrasButton 触发的。它不会清除您的临时表。
所以表格仍然是打开的,新的数据将被插入。
现在你有 3 行,最后是:

使用AddExtrasButton,您可以添加任意数量的额外内容,只要价目表中有额外内容。

用过的表:

CREATE DATABASE IF NOT EXISTS pricelist;
USE pricelist;

DROP TABLE IF EXISTS `room_rates`;
CREATE TABLE `room_rates` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `CENIK_ID` int(10) unsigned NOT NULL,
  `ROOM_TYPE` varchar(45) NOT NULL,
  `RATE_START_DATE` datetime NOT NULL,
  `RATE_END_DATE` datetime NOT NULL,
  `RATE_PRICE` decimal(5,2) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


/*!40000 ALTER TABLE `room_rates` DISABLE KEYS */;
INSERT INTO `room_rates` (`ID`,`CENIK_ID`,`ROOM_TYPE`,`RATE_START_DATE`,`RATE_END_DATE`,`RATE_PRICE`) VALUES 
 (1,1,'DBLMS','2013-01-02 00:00:00','2013-04-26 00:00:00','128.00'),
 (2,1,'DBLMS','2013-10-22 00:00:00','2013-12-18 00:00:00','128.00'),
 (3,1,'DBLMS','2013-04-26 00:00:00','2013-06-22 00:00:00','146.00'),
 (4,1,'DBLMS','2013-09-21 00:00:00','2013-10-20 00:00:00','146.00'),
 (5,1,'DBLMSExtraBed','2013-01-02 00:00:00','2013-06-22 00:00:00','15.00');

更新

只是小费:

在您的临时表中创建一个字段EXTRAS

procedure TForm1.AdvGlowButton1Click(Sender: TObject);
var
 isExtra : Boolean;
[...]


with sender As TButton do if name='AdvGlowButton1' then 
     isExtra := False else 
     isExtra := True;

if NOT isExtra then begin
  ABSQuery2.Close;
  ABSQuery2.SQL.Text:='DELETE from TEMP';
  ABSQuery2.ExecSQL;
  ABSQuery2.SQL.Text:='SELECT * from TEMP ORDER BY ID ';
  ABSQuery2.Open;
end;

[...]

if isExtra then 
   ABSQuery2.FieldByName('EXTRAS').AsString:=mem_ROOM_TYPE 
   else
   ABSQuery2.FieldByName('ROOM_TYPE').AsString:=mem_ROOM_TYPE;

【讨论】:

  • 关于您提到的原始问题:今天我注意到一些奇怪的事情:如果我选择 12.4.2013 和 26.4.2013 之间的日期范围(26.4 的价格变化),程序只给我 13 天。应该是14天。 “缺失”日期显示为 FROM 26.4.2013 - TO 26.4.2013 DAYS '0' 。基本上,如果我选择 FROM 12.4.2013 - TO 26.4.2013 或 FROM 12.4.2013 - TO 25.4.2013,最终价格是相同的。这里有什么问题?好像25点到26点的晚上都不算数???
  • 看看你的数据库是像'2013-01-02 00:00:00','2013-04-26 00:00:00'这样的值吗?重要的是00:00:00
  • 你是对的......我隐藏了时间,所以我无法检查它所以为了以防万一,我尝试了 label1.Caption:=timetostr(cxDateEdit.Time);这就是我发现时间错了的地方。从来没有想过。谢谢!
  • 我将重新设计数据库以使用 DB 中的附加功能。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多