0%

BBK工位excel多表打印-left join lateral

工位多表查询打印数据

SQL left join lateral

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
public class PrintDbLocal : PrintDbBase
{
//表中包含“已打印”
string m_sPrintedField = "已打印";

public string m_DbConnectString = "$Npgsql$Database=LocalDB;Host=LocalHost;Port=5432;Username=postgres;Password=123";
public string m_PrintTable = "四轮表";
public string m_Condition = "";
//select
public override void SelectExcelTemplateConfig(string sDefExcelTemplate)
{
base.SelectExcelTemplateConfig(sDefExcelTemplate);

m_DbConnectString = cfg.Sub("DbConnectString").GetValue(m_DbConnectString).zString();
m_PrintTable = cfg.Sub("MainTable").GetValue(m_PrintTable).zString();
m_Condition = cfg.Sub("Condition").GetValue(m_Condition).zString();
string tmpPrint = cfg.Sub("PrinterName").GetValue("").zString();
if (tmpPrint != "")
m_PrinterName = tmpPrint;
}
//ConfigEdit
public override void ShowConfig()
{
XmlConfigurationEdit edit = new XmlConfigurationEdit(cfgBoot, m_sDefExcelName);
edit.ShowDialog();
}
public override void ShowExcelConfig(string exfilter = "")
{
string sql = CreateMultiTableConfigSqlString(m_PrintTable.Split(';'));

DbDataAdapter adap = BConnString.CreateDataAdapter(sql, m_DbConnectString);
DataTable dt = new DataTable();
adap.FillSchema(dt, SchemaType.Mapped);
Dictionary<string, string> dicData = new Dictionary<string, string>();
foreach (DataColumn dc in dt.Columns)
dicData.Add(dc.ColumnName, string.Empty);
DataChange(dicData);
GetPrintExcel().ExcelConfig(dicData, exfilter);
}

//Manual
public override void ManualFindData_Time(DateTime tFrom, DateTime tTo)
{
string sql = string.Format("select [ID],[VIN],[已打印],[测试时间] from [{0}] where [测试时间] > '{1}' and [测试时间] < '{2}'".ToLgsSQL(),
m_PrintTable.Split(';')[0], tFrom.ToString(), tTo.ToString());
sql = LgsToSQL(sql);

DbDataAdapter adap = BConnString.CreateDataAdapter(sql, m_DbConnectString);
DataTable dt = new DataTable();
adap.Fill(dt);
ManualDataTable = dt;
}
public override void ManualFindData_VIN(string sVIN)
{
string sql = string.Format("select [ID],[VIN],[已打印],[测试时间] from [{0}] where [VIN] like '%{1}%'".ToLgsSQL(),
m_PrintTable.Split(';')[0], sVIN);
sql = LgsToSQL(sql);

DbDataAdapter adap = BConnString.CreateDataAdapter(sql, m_DbConnectString);
DataTable dt = new DataTable();
adap.Fill(dt);
ManualDataTable = dt;
}
public override Dictionary<string, string> ManualFromIndex(int index)
{
Dictionary<string, string> datas = new Dictionary<string, string>();
string sID = ManualDataTable.Rows[index][1].zString();


string sql = CreateMultiTableSqlString(m_PrintTable.Split(';'), sID);

DbDataAdapter adap = BConnString.CreateDataAdapter(sql, m_DbConnectString);
DataTable dt = new DataTable();
adap.Fill(dt);

DataRow dr = dt.Rows[0];
foreach (DataColumn dc in dt.Columns)
datas.Add(dc.ColumnName, dr[dc].zString());

DataChange(datas);
return datas;
}
//
public override void ManualUpdateIndex(int index)
{
ManualDataTable.Rows[index][Lgs.To("已打印")] = "Y";
string sID = ManualDataTable.Rows[index][0].zString();

string sql = string.Format("update [{0}] set [已打印] = 'Y' where [ID] = {1}",
m_PrintTable.Split(';')[0], sID);
sql = LgsToSQL(sql);

DbDataAdapter adap = BConnString.CreateDataAdapter(sql, m_DbConnectString);
DataTable dt = new DataTable();
adap.Fill(dt);
}
//Auto
bool CheckCondition(DataTable dt)
{
if (!m_Condition.Contains('='))
return true;
string[] ss = m_Condition.Split('=');
string tmpField = ss[0].Trim();
string tmpSign = ss[1].Trim();
if (dt.Columns.Contains(tmpField))
{
return dt.Rows[0][tmpField].zString().StartsWith(tmpSign);
}
return true;
}

public override void AutoPrintSave_SQL(ExcelPrintSaveOption ExOption, string sql)
{
//获取数据
DbDataAdapter m_adap = BConnString.CreateDataAdapter(sql, m_DbConnectString);
DataTable m_dt = new DataTable();
m_adap.Fill(m_dt);

if (m_dt.Rows.Count <= 0)
return;

DataRow dr = m_dt.Rows[0];
if (CheckCondition(m_dt))
{
//打印
Dictionary<string, string> dicData = new Dictionary<string, string>();
foreach (DataColumn dc in m_dt.Columns)
dicData.Add(dc.ColumnName, dr[dc].zString());
DataChange(dicData);
//
string sVIN = "12345678901234567";
if (dicData.ContainsKey("VIN"))
sVIN = dicData["VIN"];
string SaveFile = ToSaveFile(m_sDefExcelName, sVIN);

ExcelPrintSave(ExOption, dicData, SaveFile);
}
//更新
string sID = dr["ID"].zString();
sql = string.Format("update [{0}] set [已打印] = 'Y' where [ID] = {1}",
m_PrintTable.Split(';')[0], sID);
sql = LgsToSQL(sql);

DbDataAdapter adap = BConnString.CreateDataAdapter(sql, m_DbConnectString);
DataTable dt = new DataTable();
adap.Fill(dt);
}
public override void AutoPrintSave(ExcelPrintSaveOption ExOption)
{
if (!m_bAutoPrint)
return;
string sql = string.Format("select * from [{0}] where [已打印] = 'N' or [已打印] is null order by [ID] desc".ToLgsSQL(),
m_PrintTable.Split(';')[0]);
sql = LgsToSQL(sql);

AutoPrintSave_SQL(ExOption, sql);
}
public override void AutoPrintSave_VIN(ExcelPrintSaveOption ExOption, string vin)
{
string sql = string.Format("select * from [{0}] where [VIN] = '{1}' order by [ID] desc".ToLgsSQL(),
m_PrintTable.Split(';')[0], vin);
sql = LgsToSQL(sql);

AutoPrintSave_SQL(ExOption, sql);
}

private string CreateMultiTableConfigSqlString(string[] tableNames)
{
StringBuilder uploadSql = new StringBuilder();
if (tableNames.Length > 1)
{
uploadSql.Append(string.Format("select * from [{0}] ", tableNames[0]));
foreach (string tName in tableNames)
{
if (tName == tableNames[0])
continue;
uploadSql.Append(string.Format("left join [{0}] on [{1}].[VIN]=[{0}].[VIN]", tName, tableNames[0]));
}
uploadSql.Append(string.Format(" where 1=0"));
}
else
uploadSql.Append(string.Format("select * from [{0}] where 1=0",tableNames[0]));

return uploadSql.ToString();
}

private string CreateMultiTableSqlString(string[] tableNames, string VIN)
{
StringBuilder uploadSql = new StringBuilder();
if (tableNames.Length > 1)
{
uploadSql.Append(string.Format("select * from [{0}] ", tableNames[0]));
foreach (string tName in tableNames)
{
if (tName == tableNames[0])
continue;
uploadSql.Append(string.Format("left join lateral (select * from [{0}] where [{0}].[VIN]=[{1}].[VIN] order by [{0}].[ID] desc limit 1) as {0} on true ", tName, tableNames[0]));
}
uploadSql.Append(string.Format("order by [{0}].[ID] desc ", tableNames[0]));
}
else
uploadSql.Append(string.Format("select * from [{0}] where [{0}].[ID]='{1}' order by [{0}].[ID] desc",
tableNames[0], VIN));
//uploadSql.Append(string.Format(" limit 1"));

return uploadSql.ToString();
}
}