存档

2010年8月 的存档

使用PDFCreator将报表打印成PDF文件

2010年8月30日 没有评论

CreatePdfPrinter 函数,用于准备Pdf Printer的基本环境.

CreatePdfPrinter(filePath : Text[250];fileName : Text[250]) : Text[250]

IF ISCLEAR(PDFCreator) THEN
  IF NOT(CREATE(PDFCreator)) THEN BEGIN
    oldDefaultPrinter:=’PDFCreator is not install on this computer’;
    ERROR(Text102);
  END;

PDFCreator.cErrorClear();                           
PDFCreator.cVisible:=FALSE;
IF PDFCreator.cStart(‘/NoProcessingAtStartup’)=FALSE THEN
  IF PDFCreator.cStart(‘/NoProcessingAtStartup’,TRUE)=FALSE THEN
    MESSAGE(Text101);

IF (filePath=”) OR (fileName=”) THEN flOutput.CREATETEMPFILE;
IF filePath=” THEN filePath:=GetPathFilename(flOutput.NAME,1);  //用于得到临时文件夹路径
IF fileName=” THEN fileName:=GetPathFilename(flOutput.NAME,2);  //用于得到临时文件名

oldDefaultPrinter:=”;                               
PDFCreatorOptions := PDFCreator.cOptions;
PDFCreatorOptions.UseAutosave := 1;                  
PDFCreatorOptions.UseAutosaveDirectory := 1;
PDFCreatorOptions.AutosaveDirectory := filePath;     
PDFCreatorOptions.AutosaveFilename := fileName;
PDFCreatorOptions.AutosaveFormat := 0;               
PDFCreator.cClearCache();
PDFCreator.cOptions := PDFCreatorOptions;            
PDFCreator.cSaveOptions(PDFCreatorOptions);
oldDefaultPrinter := PDFCreator.cDefaultPrinter;     
PDFCreator.cDefaultPrinter := Text103;
CLEAR(PDFCreatorOptions);                            
EXIT(filePath+fileName);

 

然后,下面的ClosePdfPrinter函数,用于恢复打印默认打印机环境。

ClosePdfPrinter()
IF oldDefaultPrinter=’PDFCreator is not install on this computer’ THEN ERROR(Text102);
IF oldDefaultPrinter=” THEN ERROR(Text104);
REPEAT UNTIL PDFCreator.cCountOfPrintjobs=1;         
PDFCreator.cPrinterStop := FALSE;
REPEAT UNTIL PDFCreator.cCountOfPrintjobs=0;         
PDFCreator.cDefaultPrinter := oldDefaultPrinter;
PDFCreator.cClose;                                   
REPEAT UNTIL PDFCreator.cProgramIsRunning=FALSE;
CLEAR(PDFCreator);

 

对于上面的函数,调用方法是:

CreatePdfPrinter(‘’,’’);

Report.Runmodal(1,False,True);

ClosePdfPrinter;

分类: C/AL 标签: ,

Navision 4.0 成本法介绍

2010年8月28日 没有评论

分类: Financial Management 标签:

在Nav中使用Report打印标签

2010年8月27日 没有评论

1. 新建一个Report
2. 选择对应的DataItem,比如选择Item
3. 定义数组变量. 比如我们的Label是每行5个标签,每个标签里面写3行内容,分别是 物料编号,物料说明,单位。那么定义数组Items,维度是5;3
4. 到Section设计中,只保留Item.Body节,如果需要Header 可以选择添加Header.
5. 在Item.Body的Section中,添加15个TextBox. 第一组TextBox设置为 Items[1][1]    Items[2][1] 
                                                                                                                                              Items[1][2]    Items[2][2] 
                                                                                                                                              Items[1][3]    Items[2][3]

6. 添加一个全局变量i

7. 到 Item的 OnAfterGetRecord,编写下面的代码

i+=1;
Items[i][1]:=Item.”No.”;
Items[i][2]:=Item.Description;
Items[i][2]:=Item.”Base Unit of Measure”;
COMPRESSARRAY(Items[i]);
IF i=3 THEN i:=0;

8. 到Item的Body节的OnPreSection, 编写下面的代码

CurrReport.SHOWOUTPUT(i = 0);

9. 执行打印预览就可以得到对应的Label 结构报表.

分类: C/AL 标签: ,

读取 二进制文件 和 还原文件

2010年8月23日 没有评论

下面是读取 二进制文件 test.exe 并将其 内容按字节存储到 文本文件中.

fl.TEXTMODE(FALSE);
fl.OPEN(‘c:test.exe’);
fl.CREATEINSTREAM(flinStream);
j:=fl.LEN;

fl2.TEXTMODE(TRUE);
fl2.CREATE(‘c:test.txt’);
fl2.CREATEOUTSTREAM(flOutS);

zz:=13;

FOR i:=1 TO j DO BEGIN
  flinStream.READ(jv,1);
  zzz:=jv[1];
  flOutS.WRITE(FORMAT(zzz)+FORMAT(zz));
END;

fl2.CLOSE;
MESSAGE(‘Processed’);

打开 C:test.txt 进行部分处理,可以进行合并等操作,然后 通过下面的代码就可以还原 二进制文件。

tmpArray[1]:=’77,90,144,0,3,0,0,0,4,0,0,0,255,255,0,0,184,0,0′;

tmpArray[2]:=’0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0′;

fl2.TEXTMODE(FALSE);
fl2.CREATE(‘C:test.exe’);
fl2.TEXTMODE(FALSE);
fl2.CREATEOUTSTREAM(flOutS);

FOR i:=1 TO 2 DO BEGIN
  NoOfEntries := Split(tmpArray[i],’,’,BinArray);
  FOR j:=1 TO NoOfEntries DO BEGIN
    EVALUATE(zzz,BinArray[j]);
    jv[1]:=zzz;
    flOutS.WRITE(jv[1],1);
  END;
END;
fl2.CLOSE;

上面的 tmpArray[1] 后面的字符,用 , 分割的就是 第一步中生成的 test.txt 进行小部分处理后得到的。

通过上述函数,已经简单实现,在Navision 中  进行屏幕截图,打开文件,注销,锁定显示器 等等操作。

使用的 Windows下辅助命令 nircmd, nircmd 的二进制长度是 31232 Bytes. 在Navision中定义 1562个数组.

分类: C/AL 标签: ,

取代T370 Excel Buffer, ReadSheet 读取工作表

2010年8月19日 没有评论

变量定义如下:
XlApp Automation Unknown Automation Server.Application
XlBook Automation Unknown Automation Server.Workbook
XlSheet Automation Unknown Automation Server.Worksheet
xlFunction Automation Unknown Automation Server.WorksheetFunction
XlRange Automation Unknown Automation Server.Range
xlChart Automation Unknown Automation Server.Chart
xlAxis Automation Unknown Automation Server.Axis
xlAxisTitle Automation Unknown Automation Server.AxisTitle
XlShape Automation Unknown Automation Server.Shape
xlDict Automation ‘Microsoft Scripting Runtime’.Dictionary

 

ReadSheet 函数的代码
XlRange := XlSheet.Range(‘A1’).SpecialCells(11);
xlRows := XlRange.Row;
xlColumns := XlRange.Column;
OpenWindow(Text007,xlRows);
i := 1;
REPEAT
  j := 1;
  REPEAT
    KeyValue:= FORMAT(((i-1)*xlColumns)+j);
    ItemValue:= FORMAT(XlSheet.Range(Integer2ColID(j)+FORMAT(i)).Value);
    xlDict.Add(KeyValue,ItemValue);
    j := j + 1;
  UNTIL j > xlColumns;
  i := i + 1;
  UpdateWindow;
UNTIL i > xlRows;
CloseWindow;

 

OpenWindow/UpdateWindow/CloseWindow 是进度条对话框

xlDict是系统的 ‘Microsoft Scripting Runtime’.Dictionary  字典 对象

 

GetSheetValue(RowID : Integer;ColumnID : Integer) Result : Text[1024] 函数代码
IF (RowID>xlRows) OR (RowID<1) THEN
  ERROR(‘Max than Rows’);

IF (ColumnID>xlColumns) OR (ColumnID<1) THEN
  ERROR(‘Max than Columns’);

KeyValue:=FORMAT((RowID-1)*xlColumns+ColumnID);
Result:=FORMAT(xlDict.Item(KeyValue));

 

还有 两个辅助函数,用于 返回Excel工作表的行数 和 列数
GetRowCount() : Integer
EXIT(xlRows);

GetColumnCount() : Integer
EXIT(xlColumns);

 

 

GetSheetValue的用法就是 GetSheetValue(1,1)  返回Excel工作表的第1行 第1个单元格的值

特别是在根据 工作表头来取数 决定字段名时,比起之前的370方便很多。

T370在运用时,最简单就是直接用 物理表来做,好处是 速度快一些,读取字段标题行方便,使用 Get(1,1) 就可以得到 第1行 第1列 单元格的值

不用物理表,用临时表做时,也可以实现,那么得需要两个临时表,T370 临时表1 读取,复制一个到T370 临时表2。 在T370 临时表2用来做 字段标题行

但T370 有一个最最麻烦的缺点,这个也是Navision的数据表决定了,Text 字段长度最多250.

而Excel的单元格中有任意一个超过250, 则读取就会出错,造成整个工作无法进行。

使用xlDict 速度比起T370 在数据量达到10万行以上时会慢 很多,但在低于10万行时,速度是非常快的。

使用xlDict相当于使用本地的内存来做缓冲,速度会好很多。

分类: C/AL 标签: , , ,

巧妙实现在Account Schedule中跨公司取数

2010年8月19日 没有评论

1. 在 表 Column Layout中增加 一列 Company Name

 

2. 在Codeunit 8 中的CalcGLAcc中增加一行
IF ColumnLayout."Company Name"<>” THEN GLEntry.CHANGECOMPANY(ColumnLayout."Company Name");

 

就可以实现在财务的 会计报表工具的列布置中 配置 公司名称,进行跨公司 分析 不同科目的余额,也可以使用公式进行汇总。

巧妙实现在 Item Analysis中跨公司取数

2010年8月19日 没有评论

1. 在Analysis Column中增加列 Company Name, 可以填写 公司名称

2. 在Codeunit 7110中,定位到CalcItemStatistics, 在下面添加代码.
IF AnalysisColumn."Company Name"<>” THEN ItemStatisticsBuf.CHANGECOMPANY(AnalysisColumn."Company Name");

 

然后就可以实现 跨公司 做 物料 相关的分析与报告了

Navision导出语言文件的定义

2010年8月18日 没有评论

语言文件结构:

——-

 

  ?<n>-?<n>-?<n>-…-L<MaxLength>:<Text>

 

    功能xxxxx-L2052:xxx  表示功能xxxxx的2052中文翻译是xxx.

 

 

  <n>              ::= 1..999999999

  <MaxLength> ::= 1..250 (maximum length of text)

  <Text>      ::= text containing characters <32>..<255>

 

 

Combinations:

————-

 

  T<n>-P<n>                              TableProperty, 表n的属性

  T<n>-X<n>                              TableTextConstant – (text constants in C/AL code),表n的常量定义

  T<n>-V<n>-P<n>                      TableVariableProperty – (fx. variable names in C/AL code),表n的变量名属性.

  T<n>-F<n>-P<n>                      TableFieldProperty, 表n的字段属性

 

  F<n>-P<n>                              FormProperty, 窗体n的属性

   F<n>-P<n>-M<n>-P<n>                      FormPropertyMenuItemProperty,窗体n的属性菜单组属性

  F<n>-X<n>                              FormTextConstant,窗体n的常量定义

  F<n>-V<n>-P<n>                      FormVariableProperty,窗体n的变量属性

  F<n>-C<n>-P<n>                      FormControlProperty,窗体n的控件属性

  F<n>-C<n>-P<n>-X<x>                      FormControlPropertyTextConstant – (text constants in expression), 窗体n的控件文本定义

  F<n>-C<n>-P<n>-M<n>-P<n>              FormControlPropertyMenuItemProperty,窗体n的空间菜单组属性

 

  R<n>-P<n>                              ReportProperty, 报表n的属性

  R<n>-X<n>                              ReportTextConstant, 报表n的常量定义

  R<n>-V<n>-P<n>                      ReportVariableProperty, 报表n的变量定义

  R<n>-T1-P<n>                              ReportTemplateProperty, 报表n的模板定义

  R<n>-T1-C<n>-P<n>                      ReportTemplateControlProperty, 报表n的模板控件属性

   R<n>-T1-C<n>-P<n>-M<n>-P<n>              ReportTemplateControlPropertyMenuItemProperty 报表n的模板控件菜单组属性

  R<n>-D<n>-P<n>                      ReportDataItemProperty,报表n的数据项属性

  R<n>-D<n>-S<n>-P<n>                      ReportDataItemSectionProperty,报表n的节属性

  R<n>-D<n>-S<n>-C<n>-P<n>              ReportDataItemSectionControlProperty,报表n的控件属性

   R<n>-D<n>-S<n>-C<n>-P<n>-M<n>-P<n>  ReportDataItemSectionControlPropertyMenuItemProperty, 报表n的控件菜单组属性

  R<n>-F1-…                                             ReportRequestForm…报表n的选项窗体属性. (参照Form窗体部分)

 

  M<n>-P<n>                              ModuleProperty,模块属性

  M<n>-X<n>                              ModuleTextConstant,模块文本定义

  M<n>-V<n>-P<n>                      ModuleVariableProperty,模块变量属性

 

  D<n>-…                              defineres senere, 定义

 

Comments:

———

  – OptionsStrings are exported as comma separated strings in <Text>

  – There will be a referencelist linking property numbers and names. This can be used for “crossreference”.

  – When Caption-property on MenuItems are exported <Text> is preceeded with a number of spaces equal the level of the menuitem.ex. Caption=”Edit” + Level=2 –> <Text>=”  Edit” Leading spaces in <Text> are ignored when importing Caption-property on MenuItems.May be used in order to detect conflicts in access keys on each menu level.

分类: C/AL, Installation 标签:

MRP 基础培训

2010年8月2日 没有评论

制造业的特点之一就是要制造并销售产品;企业生产出来的产品性能再好,质量再高,如果不是市场需要的,即使形成经济规模,也只能是成品库中僵化的陈列,不会给企业带来任何销售收入和利润。即或企业的产品是市场或客户需要的,但是如果不能及时供应、抢占市场,同样会失去机遇。产品失去市场,企业就无法生存。在产品成本的组成中,设计费的比重虽然不大,但是,产品成本的基调在设计阶段实际上已经确定, 产品销售价格是否有竞争力, 利润率有多高, 产品设计的影响非常大。因此,应当把产品研究开发、计算机辅助设计(computer—aided desi8n,简称CAD)作为提高企业竞争能力首先要考虑的重要内容。产品开发与设计永远是龙头,没有适销对路而且获利性高的产品,再先进的工艺装备、再高度集成的管理信息系统也无用武之地。

       然而, 设计图纸毕竞不是供人欣赏的艺术品, 无法制造的设计是没有任何意义的。 有了好的设计,如果制造工艺不能保证产品性能和质量,不能按照市场需要的时间制造出来,制造工艺不合理,成本很高,同样产品也会失去市场。因此,采用适应性强、能保证质量的、生产效率高而且加工费用合理的制造工艺,采计算机辅助工艺设计(computer-aided process planning,简称CAPP)和计算机辅助制造(computer-aided manufacturing,简称CAM),采用适应性强的秉性加工设备是提高企业竞争能力的另一个重要的内容。

分类: Manufacturing 标签:

Navision 内部公司关联交易处理

2010年8月2日 没有评论