如何创建Delphi 4结构以将XLS中的列名映射到SQL中的列名

时间:2009-09-22 14:02:28

标签: sql delphi

我有一张EXCEL sheet.it有各种表单字段,命名为

 “smrBgm133GallonsGross/ smrBgm167GallonsGross “  

 “smrEgm133GallonsGross/ smrEgm167GallonsGross “

我在XCEL表格中添加了2个名为
的新表格字段                     smrBgm167GrosGalnsDA/smrEgm167GrosGalnsDA

我在EXCEL中制作的上述附加内容应该被命名为

`smrBgm229GallonsGross/smrEgm229GallonsGross` because. This is a  MUST  for the Delphi application to function properly.

这个Delphi-4应用程序提取并与数据库一起提供表格DATA。

我的Delphi-4应用程序工作(检查/插入/检索),以便当前几个月开始加仑牛奶“bgm229”等于结束加仑牛奶“egm229”的最后几个月,然后如果它们不同则抛出异常。

Excel表格: - Bgm167GrosGalnsDA / Egm160GrosGalnsDA Delphi代码(DB-输入/ DB-输出/验证): - bgm229 / egm229 SQL 2005 DB: - bgm167DA / egm167DA
实际上我添加的列应该是命名为“smrEgm133GallonsGross / smrEgm167GallonsGross”...我搞砸了命名它们现在正在制作....

在Delphi程序中,对于初始库存,代码是

  ExtractFormBgmInfo(smrMilkAvMilk,  'smrBgm133');
  ExtractFormBgmInfo(smrMilkDe,           'smrBgm167');

用于结束库存的代码

  ExtractFormEgmInfo(smrMilkAvMilk,  'smrEgm133');
  ExtractFormEgmInfo(smrMilkDe,           'smrEgm167');

我在列表中添加“smrBgm229GrosGalns / smrEgm229GrosGalns” 但问题是它们在EXCEL表中被错误地命名为“smrBgm167GrosGalnsDA / smrEgm167GrosGalnsDA”,而它们将被命名为'smrBgm229 /'smrEgm229'(就像Delphi代码中的情况一样)。因此。我在上面添加了......

  ExtractFormBgmInfo(smrMilkAvMilk,    'smrBgm133');
  ExtractFormBgmInfo(smrMilkDe,           'smrBgm167');
  ExtractFormBgmInfo(smrMilkDyedDe,       'smrBgm229'); 

  ExtractFormEgmInfo(smrMilkAvMilk,      'smrEgm133');
  ExtractFormEgmInfo(smrMilkDe,           'smrEgm167');
  ExtractFormEgmInfo(smrMilkDyedDe,       'smrEgm229');

这会引发错误,因为未在EXCEL表中定义smrBgm229GallonsGross / smrEgm229GallonsGross 。因此问题是如何将“smrBgm167GrosGalnsDA”从Excel工作表转换为“smrBgm229GallonsGross”然后让我的“ExtractForm”语句正确吗?

请帮助今天安排发布,并与我的超级人员讨论这个问题

1 个答案:

答案 0 :(得分:4)

您要做的是一个字符串映射到另一个字符串。您可以使用简单的字符串列表。

// Declare the variable somewhere, such as at unit scope or as a field
// of your form class
var
  ColumnNameMap: TStrings;

// Somewhere else, such as unit initialization or a class constructor,
// initialize the data structure with the column-name mappings.    
ColumnNameMap := TStringList.Create;
ColumnNameMap.Values['Bgm167 GrosGalns DA'] := 'bgm229/ egm229';

// In yet a third place in your code, use something like this to map
// the column name in your input to the real column name in your output.
i := ColumnNameMap.IndexOfName(ColumnName);
if i >= 0 then
  RealColumnName := ColumnNameMap.Values[ColumnName]
else
  RealColumnName := ColumnName;

Delphi的后续版本具有通用TDictionary类。使用TDictionary<string, string>。如果任何列名称中包含等号,则上面列出的TStrings解决方案会出现问题,但您可以通过更改NameValueSeparator属性来缓解此问题。

var
  ColumnNameMap: TDictionary<string, string>;

ColumnNameMap := TDictionary<string, string>.Create;
ColumnNameMap.Add('Bgm167 GrosGalns DA', 'bgm229/ egm229');

if not ColumnNameMap.TryGetValue(ColumnName, RealColumnName) then
  RealColumnName := ColumnName;