个人博客 用于记载日常收集的一些技术文章 ...
Access : Access 禁用 快捷键 Access : Access 禁用 快捷键 在 Microsoft Access 中,禁用或自定义快捷键可以通过不同的方法来实现,具体取决于你希望禁用哪些快捷键以及应用的范围。下面是几种常见的禁用快捷键的方法:

1. 使用 VBA(Visual Basic for Applications)禁用快捷键

如果你希望禁用特定的快捷键,可以通过 VBA 代码来实现。以下是一个示例,演示了如何通过 VBA 禁用常见的快捷键:
禁用 Ctrl+S(保存)快捷键:

打开 Access 数据库。
按 Alt + F11 进入 VBA 编辑器。
在 "ThisDatabase" 下选择 ThisDatabase(如果没有,可以插入一个新的模块)。
输入以下代码来禁用 Ctrl + S 快捷键:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = acCtrlMask And KeyCode = vbKeyS Then
KeyCode = 0 ' 禁用 Ctrl+S
End If
End Sub

确保该表单已启用事件触发器。
关闭 VBA 编辑器,保存数据库。

这种方法适用于表单中的快捷键禁用。
禁用特定快捷键:

如果你想禁用其他快捷键,只需修改 KeyCode 的值,参考常见的键盘按键常量(如 vbKeyF1 是 F1,vbKeyF2 是 F2 等)。

2. 禁用 Access 视图的快捷键

通过修改键盘快捷键的事件来禁用某些快捷键。以下是禁用某些功能的步骤:

在 Access 中打开“选项”窗口。
转到 文件 > 选项 > 快捷键。
在此处,用户可以选择禁用某些快捷键,或者完全禁用功能。此方法适用于全局禁用。

3. 禁用按键监听

在 Access 表单中,禁用所有按键可以通过监听键盘事件并将它们忽略掉:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
KeyCode = 0 ' 禁用所有按键
End Sub

这段代码会捕捉所有按键输入并将它们忽略,因此不会有任何快捷键功能。

4. 修改 Ribbon 控件

有时你可能希望禁用或隐藏 Access Ribbon(功能区)中的某些按钮或功能。通过使用 自定义 Ribbon 或 XML 代码,你可以控制用户是否可以使用某些功能。这个方法适用于更复杂的需求,通常涉及编写自定义 Ribbon 代码来禁用某些快捷键或按钮。

5. 使用安全模式启动 Access

如果你需要更严格的禁用措施,可以通过启动 Access 的安全模式来禁用一些自动运行的脚本或宏。启动 Access 时,按住 Ctrl 键可以进入安全模式,这样可以避免自动执行的宏和 VBA 脚本。
总结

使用 VBA 可以禁用特定的快捷键,如 Ctrl + S。
可以通过 Form_KeyDown 事件禁用所有快捷键。
利用 Access 的选项菜单和 Ribbon 自定义功能可以部分禁用快捷键。
郭少锋 创建 2024-12-25 15:51:32 Access
Access : Access 中生成序号 Access : Access 中生成序号 在 Microsoft Access 中生成序号(例如,自增长的编号)通常有两种方式:一种是使用 Access 表中的自增字段,另一种是在 SQL 查询或 VBA 代码中通过编程手段生成序号。
1. 使用自增字段生成序号

最简单的方式是在表中使用自增字段(AutoNumber)来生成唯一的序号。自增字段会自动为每一条新记录分配一个唯一的整数值。

创建一个包含自增字段的表:

你可以通过 Access 图形界面来创建一个表,定义一个字段为 AutoNumber 类型,Access 会自动为每条记录生成一个唯一的序号。

sql
CREATE TABLE MyTable (
ID AUTONUMBER PRIMARY KEY,
Name TEXT(50)
);

每当你向 MyTable 表中插入新记录时,ID 字段会自动生成一个递增的序号。
2. 使用 VBA 或 SQL 动态生成序号

有时你可能需要在查询或 VBA 代码中动态生成序号。例如,在结果集中为每条记录生成一个基于行号的序号。
在 VBA 中生成序号

假设你有一个查询或记录集,需要按顺序为每一行生成一个序号,可以通过 VBA 代码来实现。例如:

Sub GenerateSequence()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim seq As Long

' 打开数据库并查询表中的数据
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM MyTable ORDER BY Name")

' 初始化序号
seq = 1

' 遍历记录集并为每条记录生成序号
Do While Not rs.EOF
' 打印序号和记录内容
Debug.Print "序号: " & seq & ", Name: " & rs!Name

' 增加序号
seq = seq + 1

' 移动到下一条记录
rs.MoveNext
Loop

rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

解释:

上面的代码遍历 MyTable 表中的所有记录,并为每条记录生成一个递增的序号 seq。序号从 1 开始,每遍历一条记录就递增 1。

在 SQL 查询中生成序号(使用子查询)

Access 不支持 ROW_NUMBER() 函数(像 SQL Server 那样的窗口函数),但可以通过一些技巧来模拟序号的生成。可以使用子查询和 JOIN 来手动生成序号。

例如,假设你有一个表 MyTable,你想根据 Name 字段的排序生成一个序号。可以使用下面的 SQL 查询:

sql
SELECT
(SELECT Count(*) FROM MyTable AS T2 WHERE T2.Name <= T1.Name) AS SequenceNumber,
T1.Name
FROM MyTable AS T1
ORDER BY T1.Name;

解释:

这个查询通过子查询计算 MyTable 中每个 Name 字段之前的记录数量,从而生成一个递增的序号。
Count(*) 计算当前记录 T1.Name 排名之前(包括自身)的记录数,这样生成的 SequenceNumber 就是递增的序号。
ORDER BY T1.Name 确保记录按 Name 字段的字母顺序排列。

3. 通过 SQL 查询更新表中的序号

如果你想把生成的序号保存到表中,可以使用以下方法。假设你有一个名为 MyTable 的表,想在 SequenceNumber 字段中存储生成的序号。首先,确保表中有一个字段来存储序号,比如 SequenceNumber 字段(数据类型为 Long)。

sql
UPDATE MyTable
SET SequenceNumber =
(SELECT Count(*)
FROM MyTable AS T2
WHERE T2.Name <= MyTable.Name);

这个 SQL 查询会遍历 MyTable 中的每一行,并计算该行 Name 字段的排序序号,结果更新到 SequenceNumber 字段中。
4. 生成自定义序号

如果你希望生成的不只是简单的递增数字,而是更复杂的序号格式(例如带有前缀、日期等),可以在 VBA 中实现。例如:

Sub GenerateCustomSequence()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim seq As Long
Dim customSeq As String

Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM MyTable ORDER BY Name")

seq = 1
Do While Not rs.EOF
' 生成自定义格式的序号,例如 "ORD-001"
customSeq = "ORD-" & Right("000" & seq, 3)

' 更新表中的序号字段
db.Execute "UPDATE MyTable SET SequenceNumber = '" & customSeq & "' WHERE ID = " & rs!ID

' 增加序号
seq = seq + 1
rs.MoveNext
Loop

rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

解释:

上面的代码为每条记录生成一个自定义格式的序号(例如 "ORD-001"、"ORD-002" 等),并更新 MyTable 表中的 SequenceNumber 字段。
Right("000" & seq, 3) 用来确保序号格式始终为三位数,前面填充零。

总结

自增字段(AutoNumber)是最简单的方法,用于生成唯一的序号。
VBA 生成序号:可以通过遍历记录集和简单的计数器来生成递增的序号。
SQL 查询生成序号:可以使用子查询来动态计算排序后的序号。
自定义序号:可以根据需要生成带有前缀、后缀或其他格式的序号。

如果你有特定的需求或问题,可以进一步说明,我可以提供更具体的解决方案。
郭少锋 创建 2024-11-29 21:07:21 Access
Access : 通过 VBA 执行 SQL Access : 通过 VBA 执行 SQL 在 Microsoft Access 中,VBA(Visual Basic for Applications)可以与 SQL 语句结合使用,以便通过编程方式与数据库进行交互。以下是一些常见的在 Access 中使用 VBA 和 SQL 的基本示例:
1. 使用 SQL 查询执行操作

通过 VBA 执行 SQL 查询可以使用 DoCmd.RunSQL 或 CurrentDb.Execute。这里是一些常见的示例。
示例 1:运行一个简单的 SQL 查询(插入数据)

Sub InsertData()
Dim strSQL As String
strSQL = "INSERT INTO Customers (CustomerName, ContactName) VALUES ('John Doe', 'Jane Doe')"
CurrentDb.Execute strSQL
End Sub

这段代码会向 Customers 表中插入一行数据。
示例 2:运行一个更新查询

Sub UpdateData()
Dim strSQL As String
strSQL = "UPDATE Customers SET ContactName = 'John Smith' WHERE CustomerID = 1"
CurrentDb.Execute strSQL
End Sub

这段代码会将 CustomerID 为 1 的客户的联系人姓名更新为 "John Smith"。
示例 3:删除数据

Sub DeleteData()
Dim strSQL As String
strSQL = "DELETE FROM Customers WHERE CustomerID = 1"
CurrentDb.Execute strSQL
End Sub

这段代码会删除 CustomerID 为 1 的客户记录。
示例 4:查询数据并在 VBA 中使用

如果你想执行一个 SELECT 查询并将结果返回到 VBA 中,可以使用 DAO 或 ADO 对象。

使用 DAO

Sub QueryDataDAO()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

strSQL = "SELECT CustomerID, CustomerName FROM Customers WHERE ContactName = 'John Smith'"

Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)

' 遍历查询结果
Do While Not rs.EOF
Debug.Print rs!CustomerID & " - " & rs!CustomerName
rs.MoveNext
Loop

rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

使用 ADO

Sub QueryDataADO()
Dim conn As Object
Dim rs As Object
Dim strSQL As String

strSQL = "SELECT CustomerID, CustomerName FROM Customers WHERE ContactName = 'John Smith'"

Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurrentDb.Name
rs.Open strSQL, conn

' 遍历查询结果
Do While Not rs.EOF
Debug.Print rs.Fields("CustomerID").Value & " - " & rs.Fields("CustomerName").Value
rs.MoveNext
Loop

rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub

2. 在 VBA 中使用参数化查询

有时我们希望使用参数化查询来避免 SQL 注入攻击,并提高查询的灵活性。你可以使用 QueryDef 对象来执行带有参数的查询。

Sub ParameterizedQuery()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Dim contactName As String

contactName = "John Smith" ' 这里可以根据需要更改

strSQL = "SELECT CustomerID, CustomerName FROM Customers WHERE ContactName = [ContactName]"

Set db = CurrentDb
Set qdf = db.CreateQueryDef("", strSQL)
qdf.Parameters("[ContactName]").Value = contactName

Set rs = qdf.OpenRecordset()

' 遍历查询结果
Do While Not rs.EOF
Debug.Print rs!CustomerID & " - " & rs!CustomerName
rs.MoveNext
Loop

rs.Close
Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub

3. 通过 SQL 更新 Access 表格数据

如果你要更新 Access 表中的数据,你也可以使用 SQL 语句直接更新。

Sub UpdateAccessTable()
Dim strSQL As String
strSQL = "UPDATE Orders SET Quantity = 10 WHERE OrderID = 1001"
CurrentDb.Execute strSQL
End Sub

4. 执行复杂查询

如果需要执行更复杂的 SQL 查询,比如联合查询、分组查询等,可以将它们写成一个字符串并传递给 CurrentDb.Execute 或 DoCmd.RunSQL。

Sub ComplexQuery()
Dim strSQL As String
strSQL = "SELECT Customers.CustomerID, Customers.CustomerName, SUM(Orders.Quantity) AS TotalQuantity " & _
"FROM Customers " & _
"INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID " & _
"GROUP BY Customers.CustomerID, Customers.CustomerName " & _
"HAVING SUM(Orders.Quantity) > 50"

CurrentDb.Execute strSQL
End Sub

总结

使用 CurrentDb.Execute 执行 INSERT, UPDATE, DELETE 等操作。
使用 DAO 或 ADO 执行查询,获取返回的记录集。
支持参数化查询,提高安全性并避免 SQL 注入攻击。

通过这些方法,你可以在 VBA 中灵活地使用 SQL 来操作 Access 数据库。如果你有更具体的需求或问题,可以进一步说明。
郭少锋 创建 2024-11-29 21:04:18 Access
Access : 使用 VBA 读取本地表的数据 Access : 使用 VBA 读取本地表的数据 在 Access 中使用 VBA 读取本地表的数据,通常需要通过 DAO 或 ADO 来操作数据库。DAO(Data Access Objects)是 Access 自带的数据库访问技术,适合用来读取 Access 数据库中的表格数据。

以下是如何使用 VBA 在 Access 中读取本地表(假设表名为 MyTable)的数据的示例代码:

1. 使用 DAO 读取数据

Sub ReadDataUsingDAO()

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rowNum As Integer

' 获取当前数据库对象
Set db = CurrentDb

' 打开表格数据的 Recordset
Set rs = db.OpenRecordset("SELECT * FROM MyTable", dbOpenSnapshot)

' 如果表格有数据
If Not rs.EOF Then
rowNum = 1
' 遍历 Recordset 中的所有记录
Do While Not rs.EOF
' 输出每一行的数据(在立即窗口中查看)
Debug.Print "Row " & rowNum & ": " & rs.Fields("FieldName1").Value & ", " & rs.Fields("FieldName2").Value
' 可以把数据输出到Excel或者其它地方
rowNum = rowNum + 1
rs.MoveNext
Loop
End If

' 关闭 Recordset
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

代码解释:

CurrentDb:CurrentDb 返回当前的数据库对象,可以在 VBA 中访问当前数据库中的所有对象。
打开 Recordset:使用 db.OpenRecordset("SELECT * FROM MyTable", dbOpenSnapshot) 打开表 MyTable 中的数据,dbOpenSnapshot 表示以只读方式打开数据集。
遍历 Recordset:Do While Not rs.EOF 是一个常见的遍历记录集的方式,它会在记录集的末尾(EOF)之前一直循环。
输出数据:通过 rs.Fields("FieldName1").Value 来获取字段的值,FieldName1 需要替换成实际的字段名。
关闭资源:操作完后,要关闭 Recordset 对象,并释放相关资源。

2. 使用 ADO 读取数据

如果你希望使用 ADO(ActiveX Data Objects)来读取数据,首先需要确保引用了 ADO 库。可以通过 VBA 编辑器中的 工具 -> 引用 -> 勾选 Microsoft ActiveX Data Objects 6.1 Library 来启用 ADO。

以下是一个使用 ADO 的示例:

Sub ReadDataUsingADO()

Dim conn As Object
Dim rs As Object
Dim sql As String
Dim rowNum As Integer

' 创建 ADO 连接对象
Set conn = CreateObject("ADODB.Connection")

' 设置连接字符串(本地 Access 数据库)
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CurrentDb.Name & ";"

' SQL 查询语句
sql = "SELECT * FROM MyTable"

' 执行查询,获取 Recordset 对象
Set rs = conn.Execute(sql)

' 如果查询有数据
If Not rs.EOF Then
rowNum = 1
' 遍历 Recordset 中的所有记录
Do While Not rs.EOF
' 输出数据(示例:在立即窗口查看)
Debug.Print "Row " & rowNum & ": " & rs.Fields("FieldName1").Value & ", " & rs.Fields("FieldName2").Value
rowNum = rowNum + 1
rs.MoveNext
Loop
End If

' 关闭 Recordset 和连接
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
End Sub

代码解析:

ADO 连接字符串:conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CurrentDb.Name & ";"
这行代码为 ADO 提供了连接字符串,CurrentDb.Name 获取当前数据库的路径。
执行 SQL 查询:conn.Execute(sql) 执行 SQL 查询,返回 Recordset。
遍历 Recordset:与 DAO 类似,使用 Do While Not rs.EOF 遍历查询结果。
关闭资源:同样,操作完后需要关闭 Recordset 和 Connection,并释放对象。

3. 输出数据到 Excel

如果你想将读取的数据输出到 Excel,可以通过以下方式:

Sub ExportDataToExcel()

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rowNum As Integer
Dim xlApp As Object
Dim xlSheet As Object

' 获取当前数据库对象
Set db = CurrentDb

' 打开表格数据的 Recordset
Set rs = db.OpenRecordset("SELECT * FROM MyTable", dbOpenSnapshot)

' 创建 Excel 应用对象
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = True ' 显示 Excel 窗口

' 创建新的工作簿
Set xlSheet = xlApp.Workbooks.Add.Sheets(1)

' 在 Excel 第一行输出字段名
For i = 0 To rs.Fields.Count - 1
xlSheet.Cells(1, i + 1).Value = rs.Fields(i).Name
Next i

' 输出数据到 Excel
rowNum = 2 ' 从第二行开始
Do While Not rs.EOF
For i = 0 To rs.Fields.Count - 1
xlSheet.Cells(rowNum, i + 1).Value = rs.Fields(i).Value
Next i
rowNum = rowNum + 1
rs.MoveNext
Loop

' 关闭 Recordset
rs.Close
Set rs = Nothing
Set db = Nothing
End Sub

代码解析:

Excel 自动化:使用 CreateObject("Excel.Application") 创建 Excel 应用对象。
输出表头:在 Excel 中的第一行输出字段名。
填充数据:通过循环将 Recordset 中的数据逐行逐列填充到 Excel 表格。

总结:

使用 DAO 或 ADO 都可以在 Access VBA 中读取本地表的数据。
DAO 更适用于 Access 数据库,通常也更直接和高效。
ADO 是一个更通用的数据库访问技术,适用于多种数据库(如 SQL Server、Oracle、MySQL 等)。

郭少锋 创建 2024-11-29 20:47:44 Access
Access : 在VBA中结合SQL语句生成序号 Access : 在VBA中结合SQL语句生成序号 在VBA中结合SQL语句生成序号(例如自动为每一行添加一个序号),通常是通过对数据集进行查询,并根据需要添加一个生成的序号列。假设你使用的是Access数据库或SQL Server数据库,通过VBA和SQL结合来生成序号的操作如下:

1. 生成序号的基本思路:

如果你有一个数据表(例如 MyTable),你想为每一行数据生成一个自动增加的序号列,可以使用SQL中的 ROW_NUMBER() 函数来实现。
ROW_NUMBER() 在SQL中用于为查询结果的每一行生成一个唯一的序号。

2. VBA + SQL生成序号的例子:

假设你有一个Excel工作表,并且已经连接了一个外部数据库(例如Access或SQL Server),你希望查询一个表格并生成序号列。

代码示例:

假设你要从数据库中查询数据,并为每行添加序号:

Sub GenerateRowNumbers()
Dim conn As Object ' Connection对象
Dim rs As Object ' Recordset对象
Dim sql As String ' SQL查询语句
Dim rowNum As Integer ' 序号

' 创建连接对象
Set conn = CreateObject("ADODB.Connection")

' 数据库连接字符串,替换为你的实际连接信息
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\path\to\your\database.accdb;"

' SQL查询语句,使用ROW_NUMBER()为每行生成序号
sql = "SELECT ROW_NUMBER() OVER (ORDER BY SomeColumn) AS RowNum, * FROM MyTable"

' 执行查询并将结果存入Recordset对象
Set rs = conn.Execute(sql)

' 将查询结果写入Excel工作表
rowNum = 2 ' 假设从第2行开始填充数据
Do Until rs.EOF
' 将每行数据写入Excel,RowNum为序号列
Cells(rowNum, 1).Value = rs.Fields("RowNum").Value ' 序号
Cells(rowNum, 2).Value = rs.Fields("SomeColumn").Value ' 其他数据列
rowNum = rowNum + 1
rs.MoveNext
Loop

' 关闭Recordset和连接
rs.Close
conn.Close

Set rs = Nothing
Set conn = Nothing
End Sub

代码说明:

连接数据库:
使用 CreateObject("ADODB.Connection") 创建数据库连接对象。
conn.Open 打开数据库连接(你需要替换 Data Source 为你的数据库路径,或者使用适合你数据库的连接字符串)。

SQL 查询:
SQL 查询中使用 ROW_NUMBER() OVER (ORDER BY SomeColumn) 来为每一行生成序号,并且根据某一列(SomeColumn)排序。你可以根据实际需求调整排序规则。

处理查询结果:
将查询的每一行数据通过 Recordset(rs)对象获取,并将数据写入到Excel的工作表中。序号会在第一列(RowNum)显示,其他数据列(如 SomeColumn)根据查询结果填充。

关闭连接和清理:
查询完后,关闭 Recordset 和 Connection 对象,释放资源。

3. 对于Excel内的数据生成序号:

如果你的数据已经在Excel表中,且你只是需要为Excel表的数据生成序号,你可以通过VBA直接生成序号,而无需依赖SQL查询。下面是一个简单的VBA示例:

Sub GenerateRowNumbersInExcel()
Dim lastRow As Long
Dim i As Long

' 获取数据的最后一行
lastRow = Cells(Rows.Count, 1).End(xlUp).Row

' 在A列生成序号
For i = 2 To lastRow
Cells(i, 1).Value = i - 1 ' 序号从1开始
Next i
End Sub

代码说明:

获取最后一行:Cells(Rows.Count, 1).End(xlUp).Row 获取数据区域的最后一行。
生成序号:通过循环遍历数据范围,为每一行生成一个序号,Cells(i, 1).Value = i - 1 实现从第二行开始填充序号。

总结:

如果是从外部数据库查询并生成序号,可以使用 SQL 的 ROW_NUMBER() 函数。
如果是在Excel内部生成序号,可以通过VBA循环来实现。

郭少锋 创建 2024-11-29 20:45:46 Access
云星空 : 云星空:操作表达式 云星空 : 云星空:操作表达式 前置条件:

物料编码.物料分组 <> 蒸汽成型中底
FMaterialId.FMaterialGroup.Id <> 102906

FQtyCm > 0 OR FNote <> null 空值

物料未启用BOM编码
FMaterialid==null OR len(filter(lambda x:x.IsEnable==true and x.InvPtyId_Id==10003, FMaterialID.MaterialInvPty))<=0

物料编码.启用保质期管理 = true AND 有效期至 = null AND 生产日期 <> null
FMaterialId.FIsKFPeriod = true AND FExpiryDate = @null AND FProduceDate <> @null


计算定义公式的值并填写到指定列
FBomId = null
BOM版本 = null

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FDeptId = @null AND FSupplierId = @null
申请部门 = null AND 供应商 = null

其他出库:必须录入【申请部门】或【客户】

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FApproveDate > datetime( '2024/10/15')
审核日期 > datetime( '2024/10/15')

FWMSLineNo = "" OR FWMSLineNo = null OR FWMSLineNo = " "
WMS行号 = "" OR WMS行号 = null OR WMS行号 = " "

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
计算定义公式的值并填写到指定列

现金流量 = 收付款用途.现金流量
F_CashFlow = F_PurposeId.F_CashFlow

有效期至 =
生产日期 + 年(物料编码.保质期) if 物料编码.保质期单位 == 'Y'
else (
生产日期 + 月(物料编码.保质期) if 物料编码.保质期单位 == 'M'
else
生产日期 + 日(物料编码.保质期)
)
FExpiryDate =
FProduceDate.AddYears(FMaterialId.FExpPeriod) if FMaterialId.FExpUnit == 'Y'
else (
FProduceDate.AddMonths(FMaterialId.FExpPeriod) if FMaterialId.FExpUnit == 'M'
else
FProduceDate.AddDays(FMaterialId.FExpPeriod)
)

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
( FBaseUnitQty - FQtyReqBase ) if ( FBaseUnitQty - FQtyReqBase ) < FBaseNoStockInQty else FBaseNoStockInQty

( 基本单位数量 - 入库申请数量(基本单位) )
if ( 基本单位数量 - 入库申请数量(基本单位) ) < 基本单位未入库数量
else 基本单位未入库数量

郭少锋 编辑 2024-11-27 14:16:33 创建 2024-03-30 16:51:02 云星空
python : 数字转文本 python : 数字转文本 在 Python 中,将数字转换为文本,并且进行拼接,通常有几种方式可以实现。这里的拼接可以指的是将数字转为文本后,与其他字符串连接。

方法 1: 使用 str() 函数

str() 是 Python 中的一个内建函数,它可以将数字转换为字符串。然后可以使用 + 运算符进行拼接。

num1 = 123
num2 = 456

# 将数字转为文本并拼接
result = str(num1) + " and " + str(num2)
print(result) # 输出: "123 and 456"

方法 2: 使用 f-string (格式化字符串)

在 Python 3.6 及以上版本,推荐使用 f-string 来进行字符串拼接,这种方式不仅简洁,而且更具可读性。

num1 = 123
num2 = 456

# 使用 f-string 拼接
result = f"{num1} and {num2}"
print(result) # 输出: "123 and 456"

方法 3: 使用 format() 方法

如果你在使用较老的 Python 版本(比如 2.x),可以使用 format() 方法进行数字转换与拼接。

num1 = 123
num2 = 456

# 使用 format() 方法拼接
result = "{} and {}".format(num1, num2)
print(result) # 输出: "123 and 456"

方法 4: 使用 % 运算符 (旧式格式化)

这种方式在 Python 3 之前较为常见,虽然不推荐使用,但它仍然适用。

num1 = 123
num2 = 456

# 使用 % 运算符进行拼接
result = "%d and %d" % (num1, num2)
print(result) # 输出: "123 and 456"

总结

str() 方法是最简单直接的方式,将数字转换为字符串后用 + 拼接。
f-string 是 Python 3.6+ 中最推荐的方式,既简洁又高效。
format() 是一种较为通用的方式,适用于多种 Python 版本。
% 运算符是较旧的格式化方式,虽然可以使用,但现代 Python 中不太推荐使用。
郭少锋 创建 2024-11-27 11:24:38 python
SQL : 常用限制 SQL : 常用限制 SET FMTONLY OFF; SET NO_BROWSETABLE ON; SELECT * FROM T_BOS_COMPUTETASK; SET NO_BROWSETABLE OFF;

SET FMTONLY OFF;
这条命令关闭 FMTONLY 选项。当 FMTONLY 设置为 ON 时,SQL Server 只会返回查询结果的元数据(例如列名和数据类型),而不实际执行查询,也就是说不会返回数据行。这个选项通常用来查看查询结果的结构,但不执行查询。

设置为 OFF 后,SQL Server 将执行查询并返回实际的数据。

SET NO_BROWSETABLE ON;
这条命令用于阻止 SQL Server 将临时表显示在 SQL Server Management Studio(SSMS)的浏览界面中。也就是说,当你设置 NO_BROWSETABLE 为 ON 时,临时表将不会出现在 SSMS 的 "对象资源管理器" 中。

这个设置一般用来避免在会话期间,SQL Server 自动显示系统内部对象或临时表。

SET NO_BROWSETABLE OFF;
这条命令将前面的设置恢复为默认状态,允许在 SSMS 中浏览临时表。也就是说,当你执行这条命令后,当前会话中创建的临时表将再次出现在 "对象资源管理器" 中。

总结:

FMTONLY OFF:确保查询返回实际的数据,而不是仅仅返回元数据。
NO_BROWSETABLE ON:阻止临时表在 SSMS 中显示。
NO_BROWSETABLE OFF:允许临时表在 SSMS 中显示。

这些命令通常用于控制 SQL Server 会话的行为,尤其是在处理 SQL 查询和临时对象时,适用于高级用户或自动化脚本场景。
郭少锋 创建 2024-11-15 11:26:10 SQL
云星空 : 将 Dictionary 转换为 JSON 格式 云星空 : 将 Dictionary 转换为 JSON 格式 using Newtonsoft.Json;
using System;
using System.Collections.Generic;

class Program
{
static void Main()
{
var dictionary = new Dictionary<string, string> // 创建一个字典
{
{ "Name", "Alice" },
{ "Age", "30" },
{ "Country", "USA" }
};

string json = JsonConvert.SerializeObject(dictionary); // 将字典转换为 JSON 字符串

Console.WriteLine(json); // 输出 JSON 字符串
}
}

结果:{"Name":"Alice","Age":"30","Country":"USA"}
郭少锋 编辑 2024-11-11 14:19:13 创建 2024-11-11 14:18:52 云星空
SQL : sql 修复数据库 SQL : sql 修复数据库

DBCC CHECKDB(AIS20230719161500) -- 检查错误

alter database AIS20230719161500 set single_user with rollback immediate

DBCC CHECKDB(AIS20230719161500,repair_allow_data_loss) -- 正常情况下,一步搞定

DBCC CHECKTABLE ('AIS20230719161500..ICSaleEntry',repair_rebuild)
DBCC CHECKTABLE ('AIS20230719161500..ICStockBillEntry',repair_rebuild)
DBCC CHECKTABLE ('AIS20230719161500..ICClassProfileEntry',repair_rebuild)
DBCC CHECKTABLE ('AIS20230719161500..t_RP_Plan_Ar',repair_rebuild)

alter database AIS20230719161500 set multi_user with rollback immediate



/*

--------------------

DBCC CHECKDB(AIS20230719161500)

消息 8905,级别 16,状态 1,第 2 行
数据库 ID 11 中的区 (1:60752) 标记为已在 GAM 中分配,但没有任何 SGAM 或 IAM 分配过该区。

表错误: 对象 ID 352108395,索引 ID 1,分区 ID 304550752485376,分配单元 ID 304550752485376 (类型为 In-row data)。索引节点页 (1:44705),槽 48 指向子页 (1:39015) 和上一子页 (1:39014),但未遇到这些页。

CHECKDB 在表 'ICSaleEntry' (对象 ID 352108395)中发现 0 个分配错误和 1 个一致性错误。

表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。B 树页 (1:44886) 有两个父节点 (1:60772),槽 0 和 (1:60762),槽 0。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60762) 缺少父级(未知)和上一(页 (0:0))节点对它的引用。可能是因为系统目录中的根条目有问题。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60763) 上的上一页链接 (1:60773) 与父代 (1:60762) 槽 1 所预期的此页的上一页 (1:44886) 不匹配。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60773) 上的高键值(级别 0)不小于下一页 (1:60763) 的父代 (0:1) 槽 0 中的低键值。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60773) 上的高键值(级别 0)不小于下一页 (1:60763) 的父代 (0:1) 槽 0 中的低键值。

表错误: 表 'ICStockBillEntry' (ID 1467920351)。数据行在索引 'idx_ICStockBillEntry_FSEOutInterID' (ID 14)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
表错误: 表 'ICStockBillEntry' (ID 1467920351)。数据行在索引 'idx_ICStockBillEntry_FDetailID' (ID 19)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:

CHECKDB 在表 'ICStockBillEntry' (对象 ID 1467920351)中发现 0 个分配错误和 7 个一致性错误。
CHECKDB 在表 'ICClassProfileEntry' (对象 ID 1910297865)中发现 0 个分配错误和 1 个一致性错误。

表错误: 对象 ID 1911834023,索引 ID 1,分区 ID 406768931241984,分配单元 ID 406768931241984 (类型为 In-row data)。在扫描过程中未发现页 (1:60772),但该页的父级 (1:58980) 和上一页 (1:59327) 都引用了它。请检查以前的错误消息。

CHECKDB 在表 't_RP_Plan_Ar' (对象 ID 1911834023)中发现 0 个分配错误和 1 个一致性错误。

CHECKDB 在数据库 'AIS20230719161500' 中发现 1 个分配错误和 10 个一致性错误。

对于由 DBCC CHECKDB (AIS20230719161500)发现的错误,repair_allow_data_loss 是最低的修复级别。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

--------------------

alter database AIS20230719161500 set single_user with rollback immediate

DBCC CHECKDB(AIS20230719161500,repair_allow_data_loss)


该错误已修复。

CHECKDB 发现有 1 个分配错误和 0 个一致性错误与任何单个的对象都没有关联。
CHECKDB 修复了 1 个分配错误和 0 个一致性错误,这些错误不与任何单个对象相关联。

表错误: 将重新生成对象 ID 352108395,索引 ID 1。
该错误已修复。
表错误: 对象 ID 352108395,索引 ID 1,分区 ID 304550752485376,分配单元 ID 304550752485376 (类型为 In-row data)。索引节点页 (1:44705),槽 48 指向子页 (1:39015) 和上一子页 (1:39014),但未遇到这些页。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 2。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 3。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 4。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 5。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 6。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 7。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 8。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 9。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 10。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 11。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 12。
该错误已修复。
表错误: 将重新生成对象 ID 352108395,索引 ID 13。
该错误已修复。

CHECKDB 在表 'ICSaleEntry' (对象 ID 352108395)中发现 0 个分配错误和 1 个一致性错误。
CHECKDB 在表 'ICSaleEntry' (对象 ID 352108395)中修复了 0 个分配错误和 1 个一致性错误。

表错误: 将重新生成对象 ID 1467920351,索引 ID 7。
该错误已修复。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。B 树页 (1:44886) 有两个父节点 (1:60772),槽 0 和 (1:60762),槽 0。
该错误已修复。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60762) 缺少父级(未知)和上一(页 (0:0))节点对它的引用。可能是因为系统目录中的根条目有问题。
该错误已修复。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60763) 上的上一页链接 (1:60773) 与父代 (1:60762) 槽 1 所预期的此页的上一页 (1:44886) 不匹配。
该错误已修复。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60773) 上的高键值(级别 0)不小于下一页 (1:60763) 的父代 (0:1) 槽 0 中的低键值。
该错误已修复。
表错误: 对象 ID 1467920351,索引 ID 7,分区 ID 2066526465097728,分配单元 ID 2066526465097728 (类型为 In-row data)。页 (1:60773) 上的高键值(级别 0)不小于下一页 (1:60763) 的父代 (0:1) 槽 0 中的低键值。
该错误已修复。

表错误: 表 'ICStockBillEntry' (ID 1467920351)。数据行在索引 'idx_ICStockBillEntry_FSEOutInterID' (ID 14)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。
表错误: 表 'ICStockBillEntry' (ID 1467920351)。数据行在索引 'idx_ICStockBillEntry_FDetailID' (ID 19)中没有匹配的索引行。与以下数据行匹配的索引行的键可能丢失或无效:
该错误已修复。
CHECKDB 在表 'ICStockBillEntry' (对象 ID 1467920351)中发现 0 个分配错误和 7 个一致性错误。
CHECKDB 在表 'ICStockBillEntry' (对象 ID 1467920351)中修复了 0 个分配错误和 7 个一致性错误。
该错误已修复。
表错误: 对象 ID 1910297865,索引 ID 1,分区 ID 406668257591296,分配单元 ID 71901312342097920 (类型为 LOB data)。位于页 (1:60752),槽 0,文本 ID 94274650112 的行外数据节点未被引用。
该错误已修复。

CHECKDB 在表 'ICClassProfileEntry' (对象 ID 1910297865)中发现 0 个分配错误和 2 个一致性错误。
CHECKDB 在表 'ICClassProfileEntry' (对象 ID 1910297865)中修复了 0 个分配错误和 2 个一致性错误。

表错误: 将重新生成对象 ID 1911834023,索引 ID 1。
该错误已修复。
表错误: 对象 ID 1911834023,索引 ID 1,分区 ID 406768931241984,分配单元 ID 406768931241984 (类型为 In-row data)。在扫描过程中未发现页 (1:60772),但该页的父级 (1:58980) 和上一页 (1:59327) 都引用了它。请检查以前的错误消息。
该错误已修复。
表错误: 将重新生成对象 ID 1911834023,索引 ID 2。
该错误已修复。
表错误: 将重新生成对象 ID 1911834023,索引 ID 3。
该错误已修复。
表错误: 将重新生成对象 ID 1911834023,索引 ID 4。
该错误已修复。
表错误: 将重新生成对象 ID 1911834023,索引 ID 5。
该错误已修复。

CHECKDB 在表 't_RP_Plan_Ar' (对象 ID 1911834023)中发现 0 个分配错误和 1 个一致性错误。
CHECKDB 在表 't_RP_Plan_Ar' (对象 ID 1911834023)中修复了 0 个分配错误和 1 个一致性错误。

CHECKDB 在数据库 'AIS20230719161500' 中发现 1 个分配错误和 11 个一致性错误。
CHECKDB 在数据库 'AIS20230719161500' 中修复了 1 个分配错误和 11 个一致性错误。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。



--------------------

DBCC CHECKDB(AIS20230719161500)


AIS20230719161500的 DBCC 结果。


CHECKDB 在数据库 'AIS20230719161500' 中发现 0 个分配错误和 0 个一致性错误。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。


--------------------

alter database AIS20230719161500 set multi_user with rollback immediate

消息 5064,级别 16,状态 1,第 2 行
此时无法更改数据库 'AIS20230719161500' 的状态或选项。此数据库处于单用户模式,当前某个用户已与其连接。
消息 5069,级别 16,状态 1,第 2 行
ALTER DATABASE 语句失败。


alter database AIS20230719161500 set single_user with rollback immediate

alter database AIS20230719161500 set multi_user with rollback immediate


*/
郭少锋 创建 2024-11-02 10:52:35 SQL