使用http get进行操作的例子,包含请求和接收两部分
金蝶bos python开发gethttp的代码 #引入clr运行库 import clr #添加对cloud插件开发的常用组件的引用 clr.AddReference("System") clr.AddReference("System.Web.Extensions") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") clr.AddReference("Newtonsoft.Json") #导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入) import sys from System import * from System.Collections.Generic import * from System.Threading import * from System.IO import * from System.Net import * from System.Text import * from System.Security.Cryptography import * from System.Web.Script.Serialization import * from System.Collections.Generic import Dictionary from Newtonsoft.Json.Linq import * def BarItemClick(e) : if e.BarItemKey=="SLJH_tbButton_2" : #例如我这边要get这个网址,auth_code主要是做服务器验证用的,防止恶意请求 test = get("http://ltxsd.com:18000/api/cycle?auth_code=SECRET123") #这边是返回值信息 this.View.ShowMessage(test) #这个get函数 def get(url): req = HttpWebRequest.Create(url); req.Method = "GET"; rsp = req.GetResponse(); stream = rsp.GetResponseStream(); reader = StreamReader(stream, Encoding.GetEncoding("utf-8")); result = reader.ReadToEnd(); return result
#get服务器 #python接受get的代码例子,这个案例中,通过get获取当前年份的周数,比如25年第9周,返回的就是2509 from http.server import HTTPServer, BaseHTTPRequestHandler from urllib.parse import urlparse, parse_qs import datetime from typing import Optional, Tuple # 配置常量 CONFIG = { "PORT": 18000, "VALID_AUTH_CODES": {"SECRET123", "TOKEN456"}, "API_ENDPOINT": "/api/cycle" } class CycleAPIHandler(BaseHTTPRequestHandler): """处理周期信息请求的HTTP处理器""" def _parse_auth_code(self) -> Tuple[Optional[str], Optional[int]]: """解析查询参数中的认证码""" query = urlparse(self.path).query params = parse_qs(query) if 'auth_code' not in params: return None, 400 auth_codes = params['auth_code'] if len(auth_codes) != 1: return None, 400 return auth_codes[0], None def _generate_cycle_info(self) -> str: """生成当前周期信息""" current_date = datetime.datetime.now() year = current_date.isocalendar().year week_number = current_date.isocalendar().week # ISO 标准可能存在跨年周数,需要修正年份 if current_date.month == 1 and week_number > 50: year -= 1 elif current_date.month == 12 and week_number == 1: year += 1 return f"{year % 100:02d}{week_number:02d}" def _send_text_response(self, status_code: int, data: str): """发送纯文本格式响应""" self.send_response(status_code) self.send_header("Content-type", "text/plain") self.end_headers() self.wfile.write(data.encode("utf-8")) def do_GET(self): """处理GET请求""" # 端点验证 if urlparse(self.path).path != CONFIG["API_ENDPOINT"]: self._send_text_response(404, "Endpoint not found") return # 解析认证码 auth_code, error_code = self._parse_auth_code() if error_code: self._send_text_response(error_code, "Missing auth_code parameter") return # 认证验证 if auth_code not in CONFIG["VALID_AUTH_CODES"]: self._send_text_response(401, "Invalid authentication") return # 生成并返回周期信息 try: cycle = self._generate_cycle_info() self._send_text_response(200, cycle) except Exception as e: self._send_text_response(500, f"Internal server error: {str(e)}") def run_server(port: int = CONFIG["PORT"]): """启动HTTP服务器""" server_address = ("", port) httpd = HTTPServer(server_address, CycleAPIHandler) print(f"Server running on port {port}...") try: httpd.serve_forever() except KeyboardInterrupt: print("\nServer shutting down...") httpd.server_close() if __name__ == "__main__": # 可以通过修改CONFIG配置不同环境参数 run_server()
写入对应字段 ,如果有点击按钮就执行插入到指定字段,F_ORA_SRKHMC_83G1是我的字段名称
#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
from Kingdee.BOS.Core import *
def DataChanged(e):
#写入指定字段的值
this.Model.SetValue("F_ORA_SRKHMC_83G1","测试信息数据");
通过sql语句更新数据 (一个通过SQL生成年+周数,并更新数据库的例子)
#表单插件执行更新的例子SQL语句前最好加一句/*dialect*/代表是使用mssql环境而非KSQL环境
#具体例子看这个老师的资料说明:https://vip.kingdee.com/link/s/ZzKXy
import clr
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS.App.Data import *
def BarItemClick(e):
#在列表点击任意按钮触发更新周期信息
#FAPPROVEDATE 审核日期
#F_SLJH_DATECODE_83G 周期
#F_ORA_COMBO_QTR 是否末道工序
sql ="""/*dialect*/UPDATE b
SET b.F_SLJH_DATECODE_83G = RIGHT(CAST(YEAR(a.FAPPROVEDATE) AS VARCHAR(4)), 2) +
RIGHT('0' + CAST(DATEPART(ISO_WEEK, a.FAPPROVEDATE) AS VARCHAR(2)), 2)
FROM T_SFC_OPTRPT a
LEFT JOIN T_SFC_OPTRPTENTRY b ON a.fid = b.fid
WHERE b.F_SLJH_DATECODE_83G = ''
AND a.FAPPROVEDATE > '2025-02-24'
AND a.F_ORA_COMBO_QTR = '1';
"""
DBUtils.Execute(this.Context,sql);
#如果是select的方式进行查询数据,那么就改为:DBUtils.ExecuteScalar(this.Context,sql,None);
#主要就是ExecuteScalar和Execute的区别
/*
在金蝶云星空的DBUtils类中,ExecuteScalar和Execute是两个常用的方法,但它们在用途和返回值方面有显著区别。以下是对两者的详细解释和区别:
DBUtils.ExecuteScalar
用途:
ExecuteScalar用于执行查询语句(如SELECT语句),并返回查询结果的第一行第一列的值。
常用于需要返回单个值的情况,例如查询计数、求和等聚合函数的结果。
返回值:
返回查询结果的第一行第一列的值。如果查询结果为空,可以设置一个默认值来替代返回的空值。
示例:
sql = "SELECT COUNT(*) FROM T_SFC_OPTRPT WHERE FAPPROVEDATE > '2025-02-24'"
count = DBUtils.ExecuteScalar(this.Context, sql, 0)
这段代码会返回满足条件的记录数,如果没有任何记录,则返回默认值0。
DBUtils.Execute
用途:
Execute用于执行不需要返回数据的语句,如DDL(数据定义语言)、UPDATE、DELETE语句。
常用于执行更新、删除操作或创建表等操作。
返回值:
返回值为影响的行数。即执行操作后,有多少行数据受到了影响。
*/
读取列表字段内容进行判断:
import clr
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS.App.Data import *
def BarItemClick(e):
#如果是条码打印按钮
if e.BarItemKey=="tbBarCodePrint" :
this.ListModel;#获取列表数据模型
selectedRowsInfo = this.ListView.SelectedRowsInfo;
datas = this.ListModel.GetData(selectedRowsInfo);
for row in datas:
sfmdgj=row["F_ora_Combo_qtr"];#是否末道工序字段
if sfmdgj=='1': #1=是 0=否
#如果字段内容匹配,就进一步执行动作
金蝶云星空使用python插件直接更新数据