Page 57 of 61« First...5556575859...Last »

Global competition is not between the companies but between the supply chains.

Supply Chain Management Network:
SCM network includes all the companies involved in all the upstream and downstream flows of products, services, finances, and information from the initial supplier to the ultimate customer.

SCM network includes:
Raw material and semi-finished products suppliers, distributors and warehouses, manufacturing centers, consumers.

Main processes in Supply Chain:
*Production planning & inventory control
*Distribution and logistics

Supply chain value(supply chain profitability) is difference between revenue generated from the customer and the overall cost across the supply chain

Supply Chain Costs:
Acquisition, storage, transportation, repair, maintenance, production operation, information, salvage/resale, disposal, recycle, etc.

Supply Chain Management Objectives
*Minimize the cost and making profits while keeping a reasonable service level customer satisfaction/quility/on time delivery,etc.
*Supply chain management is a set of approaches utilized to efficiently integrate suppliers, manufactures, warehouses, and stores, so that merchandise is produced and distributed at the right quantities, to the right locations, and at the right time, in order to minimize system wide costs while satisfying service level requirements.

Logistics VS. Supply Chain Management
Logistics Management
Logistics is that part of the supply chain process that plans, implements, and controls the efficient, effective flow and storage of goods, services, and related information from point of origin to point of consumption in order to meet a customer’s requirments.[Council of Logistics Management, 1998]
Supply Chain Management
Supply chain management is the integration of key business processes from end user through original suppliers, that provides products, services, and information that add value for customers and other stakeholders.[Global Supply Chain Forum, 1998]

Global optimum in major decisions in:
Process & information system development, structuring the distribution networks, price policies, procurement policies, production planning, performance evaluation..etc.



一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:
声明的语法是:

Private Declare Function …

Private Declare Sub…..

这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。
如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。

先添加一个模块(如图示),

然后采用如下语法声明:

Public Declare Function….

Public Declare Sub….

Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。 声明完毕我们就能在程序中使用此API函数了。
二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:

(1)忽略函数返回值的调用:

SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3

注意此时函数的参数是不加括号的。

(2)Call方法调用:

Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)

注意这里需要加上括号,但我们不取回函数的返回值。

(3)取得函数返回值的调用:

MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)

此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。
三、几个问题的说明:
(1)声明中的Lib 和 Alias 是怎么回事

一般情况下WIN32API函数总是包含在WINDOWS系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用 来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的 路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要 使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。

Alias用于指定API函数的别名,如果我们调用的API函数要使 用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样 的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即 可。
(2)常见的API参数类型的说明

API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型 的值;另外几种常见的参数类型有:整型Integer、Byte型、String型等。
(3)声明中的ByVal是作什么用的

这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传 递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字, 这样VB就采用传值方式传递参数了。
(4)怎样得到完整的API函数声明

VB自带了API文本查看器API TEXT VIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴到程序中即可。

   今天刚做一个程序,里面有用到某点颜色的RGB值,又懒得去下载现成的颜色提取软件。想想利用VB自己写个,应该也不难吧。所以就查了查API,顺手写了 这个颜色提取的小程序。程序中利用了3个API,GetCursorPos、GetDC、GetPixel。原理是利用GetCursorPos得到当前 鼠标的位置,用GetDC获得桌面的场景,最后用GetPixel来提取该点的RGB值和十六进制的颜色值。在本页底部可下载原代码

程序运行界面如图,比较简单,有兴趣自己可以改改。VB中是用RGB来表示颜色的,如果你要做网页,就会用十六进制值了。

点击输入RGB,然后可分别在R、G、B中输入数字(0-255之间),按回车可自动获取RGB值和HEX值。

点击从屏幕抓取,可获得屏幕上任意一点的RGB和HEX值。程序右下角是鼠标的位置。

具体代码:

Option Explicit
Private Declare Function GetCursorPos Lib “user32″ (lpPoint As POINTAPI) As Long
Private Declare Function GetPixel Lib “gdi32″ (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetDC Lib “user32″ (ByVal hwnd As Long) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Dim p As POINTAPI
Dim lrgb As Long
Dim sthex As String

Private Sub Form_Load()
Timer1.Interval = 20
Timer2.Interval = 20
Timer1.Enabled = True
Timer2.Enabled = False
End Sub

Private Sub opinput_Click()
Timer2.Enabled = False
tr.Text = “”
tg.Text = “”
tb.Text = “”
tr.ToolTipText = “输入RGB值 0-255″
tg.ToolTipText = “输入RGB值 0-255″
tb.ToolTipText = “输入RGB值 0-255″
tr.SetFocus
End Sub

Private Sub opinput_DblClick()
Timer2.Enabled = False
MsgBox “已停止提取颜色”
End Sub

Private Sub oppick_Click()
Timer2.Enabled = True
Me.Caption = “颜色提取 – 双击选项框可停止提取”
tr.ToolTipText = “”
tg.ToolTipText = “”
tb.ToolTipText = “”
End Sub

Private Sub oppick_DblClick()
Timer2.Enabled = False
MsgBox “已停止提取颜色”
End Sub

Private Sub tb_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
lrgb = RGB(tr.Text, tg.Text, tb.Text)
trgb.Text = lrgb
Picture1.BackColor = lrgb
If lrgb = 0 Then
thex.Text = “000000″
Else
sthex = Hex(lrgb)
thex.Text = Right(sthex, 2) & Mid(sthex, 3, 2) & Left(sthex, 2)
End If

End If
End Sub

Private Sub tg_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
tb.SetFocus
End If
End Sub

Private Sub Timer1_Timer()
Call GetCursorPos(p)
lx.Caption = “x =  ” & p.x
ly.Caption = “y =  ” & p.y
‘获取鼠标位置
End Sub

Private Sub Timer2_Timer()
Dim hwnd, lrgb As Long
hwnd = GetDC(0)
lrgb = GetPixel(hwnd, p.x, p.y)
trgb.Text = lrgb
Picture1.BackColor = lrgb
tr.Text = lrgb Mod 256
tg.Text = (lrgb \ 256) Mod 256
tb.Text = lrgb \ 256 \ 256
If lrgb = 0 Then
thex.Text = “000000″
Else
sthex = Hex(lrgb)
thex.Text = Right(sthex, 2) & Mid(sthex, 3, 2) & Left(sthex, 2)
End If

End Sub

Private Sub tr_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
tg.SetFocus
End If
End Sub
代码下载:pickcolor.rar

SMTP被用来在因特网上传递电子邮件。文件RFC821规定了该协议的所有细节。但是你只须记住下面的内容--该协议的基本命令和方法就行了。协议的原 理很简单。无非是一个客户端计算机向服务器发送命令,然后服务器向客户端计算机返回一些信息。客房端发送的命令以及服务器的回应都是字符串,你并不需要特 别的软件就能读出它们。如果你仔细看过Winsock Terminal示例程序的源代码,你就会发现这一点。现在让我们用这个示例程序来向自己发一封电子邮件吧。

运行示例程序,单击”Connect”按钮,在”Connect to…”对话框中输入你的电子邮件服务器的地址,选择SMTP选项。最后按”Connect”按钮。如果连接成功,Winsock控件会产生 Connected事件,在状态栏中也可看到连接成功的信息。在主文本窗口中你将看到从服务器返回的文本。该文本包含一个三位数的代码及描述,例如:

220-ns.cinfo.ru Sendmail 8.6.12/8.6.9 ready at Wed, 22 Apr 1998 22:54:41 +0300
220 ESMTP spoken here

不必太过留意这些描述。因为这些描述可能会因服务器而异。你只须要知道代码所代表的意思就行了。代码220表示成功建立连接,服务器等待你的第一个命令。向服务器传递的第一个命令是HELO. 该命令包含一个参数,即你的邮箱名。

HELO oleg

注意: 在RFC821中,HELO是一个可选择性命令,如果服务器不要求该命令的话,你可以把它忽略掉。

如果命令成功,服务器会返回一个代码为250的回应。下一步用MAIL FROM命令告诉服务器你想发一封邮件。该命令以发信人的邮件地址为参数。

MAIL FROM: oleg@vbip.com

发完命令后,如果服务器返回一个代码为250回应,你就可以向服务器发送RCPT TO命令了。该命令以收信人地址为参数,一看便知是告诉服务器你想将邮件发到收信人地址处。

RCPT TO: somebody@domain.com

如果你想将邮件发给多个收件人的话。你需要多次使用RCPT TO命令,对每个命令,服务器都会返回代码为250的回应。

现 在你可以向服务器发送邮件正文了。用DATA命令告诉服务器以下的内容为邮件正文。在你从服务器收到代码为354的回应后,你就可以发送邮件正文了。邮件 按行发送,每行邮件以一个无回车的换行符结束(在VB中就是vbLf)示例程序知道何时使用换行符,何时使用回车加换行符。所以你只须按回车键就行了。下 面是一个例子:

Subject: My first e-mail message.

First line of a message.
Second line.
.

注意上面最后一行的最后一个字符是一个小数点。这是正文结束的标志。用VB代码表示就是vbLf & “.” & vbCrLf. 服务器收到这个标志后,就会立即向你返回一个代码为250的回应以及该邮件的唯一ID号。

250 WAA10568 Message accepted for delivery

任务完成了,你可以继续发送下封邮件,也可以断开同服务器的连接。如果要断开同服务器的连接就用QUIT命令。在这种情况下,服务器会返回一个代码为221的回应并断开连接。

QUIT
221 ns.cinfo.ru closing connection

除了由一个Internet用户传递给另一个用户的信息之外,电子邮件中还必须包含附加的服务信息。SMTP服务器利用这些信息来传递邮件,而客户端的邮 件接收软件则利用这些信息来对邮件进行分类。这些附加的数据用信头的形式被包含在邮件主体中。邮件正文则紧随其后。如果你是用Outlook Express,用你的鼠标右键点一封邮件,然后选取“属性”,你就可以看到信头是什么样的了。如下图:
在“详细资料”标签页中的文本就是邮 件的信头。如果你想看邮件的所有内容,只须点选一下“邮件源文件…”按钮。对普通用户而言,邮件信头一点都不吸引人。但是如果你想开发互联网应用程序 的话,你就不能不对此有所了解。如果你不遵守下面这些简单的规则,只能导致程序的失败。
在这里你能找到建立信头的规则,信头每个字段的目的,所运 用的语法以及数据格式等等内容。RFC822是一个大文件,在这里我们无法包含该文件的所有细节。你可以把本文的内容当作是一个快速入门,在多数情况下这 已经很足够了。想知道该文件的所有内容,就把这个文件下载回去慢慢咀嚼吧。

每封邮件都有两个部分:信头和主体。邮件主体就是你发送给收件人 的数据(包括文本或文件)信头是一系列的字段(Fields)。一个空字符串将主体同信头分开,也就是说一个空字符串标记了信头的结束。在VB中,空字符 串可写成vbCrLf + vbCrLf. 通过InStr函数你可以很方便地把它找出来。例如:

intBorderLine = InStr(1, strMessage, vbCrLf + vbCrLf)

信 头部分的字段可分为两类。一类是由你的电子邮件程序产生的,另一类是邮件通过SMTP服务器时被加上的。在所有被SMTP服务器加上的字段中,对我们而言 最重要的是Message-Id字段。这个字段是由你传向的SMTP服务器加上的。这个一个唯一的ID号。你可用这个号码作为邮件的编号。

下表列出了可由用户的邮件程序控制的信头字段。这并不意味着所有的字段都是必须的。实际上可以忽略形成信头这一步骤而只发送正文。让你的SMTP服务器为你加上最起码的必需字段。

信头字段 目的
From 邮件作者
Sender 发信人
Reply-To 回邮地址
To 收信人地址
CC 另一个收信人地址
BCC 收信人地址,但这个收信人看不到其它收信人的地址。
Subject 主题
Comments 备注
Keywords 关键字,用来进一步搜索邮件
In-Reply-To 被当前邮件回复的邮件的ID
References 几乎同In-Reply-To一样
Encrypted 加密邮件的加密类型
Date 发信日期
表1. 邮件信头字段
建立信头的规则很简单。用冒号将字段名同字段值分开。每个字段从一个新的字符串开始,但是字段值可能会占用几个字符串,这取决于SMTP服务器对字符串长度的限制。

不幸的是,RFC822推荐的日期和时间格式同VB不兼容。当我们编辑邮件时,我们得用FORMAT函数例如:

Format(Now,”ddd, dd mmm yyyy hh:mm:ss”) & ” GMT +0400″

尽管如此,为了将Internet的日期/时间转换成VB的日期类型,你有必要开发你自己的函数或是调用WinInet API中的InternetTimeToSystemTime函数。如果想知道更多这方面的规定,读读RFC822吧。

除了标准字段外,信头还可以包含用户自定义的字段。这些用户自定义的字段名必须由X开始。例如:

X-Mailer: Microsoft Outlook Express 4.72.2106.4

在对文件进行读写操作之前,有时经常需要事先判断指定文件是否存在,这时最简单的办法,就是利用filesystemobject对象的 fileexists方法来进行判断。filesystemobject对象不是vb默认内置对象,所以使用前必须先引用,具体为选择“工程”-“引 用”,然后选中microsoft scripting runtime,接着就可以利用filesystemobject的fileexists方法来判断文件是否存在。  FileExists 方法,如果指定的文件存在,返回 True,若不存在,则返回 False。
语法:
object.FileExists(filespec)
FileExists 方法语法有如下几部分:
object 必需的。始终是一个 FileSystemObject 的名字。
filespec 必需的。要确定是否存在的文件的名字。如果认为文件不在当前文件夹中,必须提供一个完整的路径说明(绝对的或相对的)。

‘判断当前目录是否存在list.txt文件
Dim fs As New FileSystemObject
If fs.FileExists(App.Path & “\list.txt”) Then
MsgBox “file is already existed”
Else
MsgBox “file is not existed”
End If
同样,利用Filesystemobject的FileExists方法可以完成很多对文件的操作。

Page 57 of 61« First...5556575859...Last »