一尘不染

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

sql

我有一个EXCEL工作表。它有各种形式的字段,命名为

 鈥渟mrBgm133GallonsGross/ smrBgm167GallonsGross 鈥�

 鈥渟mrEgm133GallonsGross/ smrEgm167GallonsGross 鈥�

我在XCEL工作表中添加了2个名为
smrBgm167GrosGalnsDA/smrEgm167GrosGalnsDA

我在EXCEL中制作的上述插件应正确命名为

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

这个Delphi-4应用程序提取并与DB串联化DATA表格。

我的Delphi-4应用程序正常工作(检查/插入/检索),因此当前开始加仑牛奶gm229''的当前月份等于结束最近加仑牛奶gm229’‘的最后几个月,然后如果它们不同则抛出异常。

Excel工作表:-Bgm167GrosGalnsDA / Egm160GrosGalnsDA Delphi代码(DB-输入/ DB-
输出/验证):-bgm229 / egm229 SQL 2005 DB:-bgm167DA / egm167DA
实际上,我添加的列应已 命名为“ smrEgm133GallonsGross / smr。 。我 搞砸了他们的名字,他们现在正在生产中…。

在Delphi程序中,对于初始清单,其代码为

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

对于结束库存的代码是

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

我在列表中添加了mrBgm229GrosGalns / smrEgm229GrosGalns'',但问题是它们在EXCEL表中被错误地命名为mrBgm167GrosGalnsDA /
smrEgm167GrosGalnsDA’‘,而它们被命名为’smB’mm(29)就像在Delphi代码中一样)。因此。我在上面添加了…

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

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

这会引发错误,因为EXCEL工作表中未定义smrBgm229GallonsGross / smrEgm229GallonsGross 。因此,问题是
如何将Excel工作表中的“ mrBgm167GrosGalnsDA”转换为“ mrBgm229GallonsGross” ,然后使我的“
xtract”正确。 ?

请帮忙安排今天的发布,并与我的上司讨论


阅读 141

收藏
2021-03-17

共1个答案

一尘不染

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

// 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;
2021-03-17