#ifndef CCSDATABIND_H #define CCSDATABIND_H #include #include #include "reportdataset.h" #if(QT_VERSION_MAJOR == 6) #include #endif namespace CCS_Report { //extern QHash> DataSets; class CCSDataBind { public: static QString bingdataT(QString bindSource,QList> filter) { if (IsDataSourceField(bindSource)) { QPair pairField = ParserField(bindSource); auto find_index = DataSets.find(pairField.first); QList a = DataSets[pairField.first]; if(find_index != DataSets.end()) { foreach (QObject* item ,find_index.value()) { if (Filter(item,filter)) { int index = item->metaObject()->indexOfProperty(pairField.second.toStdString().c_str()); if (index >=0) { QMetaProperty metaProp = item->metaObject()->property(index); return metaProp.read(item).toString(); /*QString strValue = metaProp.read(item).toString(); qDebug() << strValue.isEmpty() << strValue.isNull(); return strValue;*/ } } } } } return nullptr; } /* * 实现简单的动态表格,根据表和字段获取某个字段下的多条记录, */ template static QList bingdataDataset(QString bindSource,QList t,QPair key) { QList listRtn; if (IsDataSourceField(bindSource)) { QList listName = ParserField(bindSource); foreach (T* item,t) { int index = item->metaObject()->indexOfProperty(listName[1].toStdString().c_str()); if (index >=0) { if (key.first != "") { int index1 = item->metaObject()->indexOfProperty(key.first.toStdString().c_str()); if (index1 >=0) { QMetaProperty metaProp1 = item->metaObject()->property(index1); QString strCmp = metaProp1.read(item).toString(); if (!(strCmp == key.second)) { continue; } } } QMetaProperty metaProp = item->metaObject()->property(index); listRtn.append(metaProp.read(item).toString()); } } } return listRtn; } static bool IsDataSourceField(QString fieldS) { #if(QT_VERSION_MAJOR == 6) QRegularExpression rx("\\$[F]\\{*.*\\}"); QRegularExpressionMatch match = rx.match(fieldS); if (match.hasMatch()) { return true; } #else QRegExp rx("\\$[F]\\{*.*\\}"); int rtn = rx.indexIn(fieldS); if (rtn >= 0) { return true; } #endif return false; } static bool IsKeyField(QString fieldS) { #if(QT_VERSION_MAJOR == 6) QRegularExpression rx("\\$[D]\\{.*\\}"); QRegularExpressionMatch match = rx.match(fieldS); if (match.hasMatch()) { return true; } #else QRegExp rx("\\$[D]\\{.*\\}"); int rtn = rx.indexIn(fieldS); if (rtn >= 0) { return true; } #endif return false; } static QString ParserKeyField(QString KeyString,int& iStart,int& iEnd) { QString left = "{"; QString right = "}"; QString field = ""; iStart = KeyString.indexOf(left); iEnd = KeyString.indexOf(right); if ((iStart > 0) && (iEnd >0) && (iEnd > iStart)) { field = KeyString.mid(iStart+1,iEnd-iStart-1); } return field; } static void ParserKeyFields(QString KeyString,QList&listFields, QList>& listPostion) { QString left = "{"; QString right = "}"; QString strValue = KeyString; int iInialEnd = 0; while (true) { int iStart = strValue.indexOf(left); int iEnd = strValue.indexOf(right); if ((iStart > 0) && (iEnd > 0) && (iEnd > iStart)) { QString field = strValue.mid(iStart + 1, iEnd - iStart - 1); if (field.length() > 0) { QPair pairPositon; pairPositon.first = iStart + iInialEnd; pairPositon.second = iEnd+iInialEnd; listPostion.append(pairPositon); listFields.append(field); iInialEnd += iEnd + 1; } strValue = strValue.mid(iEnd+1); } else { break; } } } static QPair ParserField(QString fieldS) { QPair pairFieldInfo; QString left = "{"; QString right = "}"; int first = fieldS.indexOf(left); int end = fieldS.indexOf(right); //if ((first + 1) > (end - first - 1)) //{ // int i=0; //} QString field = fieldS.mid(first+1,end-first-1); int dot = field.indexOf("."); if (dot > 0){ pairFieldInfo.first = field.mid(0,dot); pairFieldInfo.second = field.mid(dot+1); } return pairFieldInfo; } template static bool Filter(T* item,QList>& filter) { bool bRecord = true; for(int i=0;i pairfilter = filter.at(i); int index = item->metaObject()->indexOfProperty(pairfilter.first.toStdString().c_str()); if (index >=0) { QMetaProperty metaProp = item->metaObject()->property(index); QString strMatchValue =metaProp.read(item).toString(); if (strMatchValue != pairfilter.second) { bRecord = false; break; } }else{ bRecord = false; break; } } return bRecord; } template static QList GroupByT(QString field,QList t,QList> filter) { QList listRtn; QHash hashValue; bool bRecord; foreach (T* item, t) { bRecord = Filter(item,filter); if (bRecord) { int index = item->metaObject()->indexOfProperty(field.toStdString().c_str()); if (index >=0) { QMetaProperty metaProp = item->metaObject()->property(index); QString tmp = metaProp.read(item).toString(); if (!(hashValue.contains(tmp))) { listRtn.append(tmp); hashValue.insert(tmp,0); } } } } return listRtn; } template static QList GroupByT(QStringList field, QList t, QList> filter) { QList listRtn; QList listFieldValue; QHash hashValue; bool bRecord; QString strValue = ""; QList listIndex; QStringList listValue; foreach(T * item, t) { bRecord = Filter(item, filter); if (bRecord) { strValue = ""; listValue.clear(); listIndex.clear(); for (auto f : field) { int index = item->metaObject()->indexOfProperty(f.toStdString().c_str()); if (index >= 0) { listIndex.append(index); QMetaProperty metaProp = item->metaObject()->property(index); QString strValue1 = metaProp.read(item).toString(); strValue += strValue1; strValue += ","; listValue.append(strValue1); } } if (listIndex.count() != field.count()) continue; if ((!listFieldValue.contains(strValue))) { listFieldValue.append(strValue); listRtn.append(listValue); } } } return listRtn; } //此方法实现动态列的数据,从三维变成二维展示的过程 /* * A B C D A B c1 c2 c3 * a1 b1 c1 d1 a1 b1 d1 d2 d3 * a1 b1 c2 d2 ====> * a1 b1 c3 d3 * */ /// /// dynamicField 动态表头列 dynamicValue动态内容列 dyanmicValue非动态列 t 表 key groupID /// template static QMap> TransDynamicColumnDataT(QString dynamicField,QString dynamicValue, QList noDynamicField,QList t,QList> filter) { //if (transField == "" || varField =="") return NULL; int iCount = 1; QString compareRecord; QString tranField; QString value; QHash hashRecordIdentify; QMap> listTranslatedData; QString strRecordIdentify =GetFormatName(iCount++,5); //考虑QMap中的排序的问题 foreach (T* item, t) { bool bRecord = Filter(item,filter); if (!(bRecord)) { continue; } tranField=""; value=""; compareRecord=""; QMap hashRecord; for (int i = 0; i < item->metaObject()->propertyCount(); ++i) { QMetaProperty metaProp = item->metaObject()->property(i); QString strField = metaProp.name(); //字段名 QString strValue = metaProp.read(item).toString(); //字段值 //判断此字段是否在非动态内容中 if (noDynamicField.contains(strField)) { //判断非动态行中是否有此记录,作为唯一标识 if (!(hashRecord.contains(strField))) { hashRecord.insert(strField,strValue); compareRecord += strValue+"&"; } }else if (strField==dynamicField) { //因为不能确定哪个字段先出现,所以先获取此值,等读取完这条记录后,才进行确定 tranField = strValue; }else if (strField==dynamicValue) { value = strValue; } } if (!(hashRecord.contains(tranField))) { hashRecord.insert(tranField,value); } if (!(hashRecordIdentify.contains(compareRecord))) { hashRecordIdentify.insert(compareRecord,strRecordIdentify); strRecordIdentify =GetFormatName(iCount++,5); } QString strKey = strRecordIdentify+compareRecord; if (listTranslatedData.contains(strKey)) { listTranslatedData[strKey].insert(tranField,value); }else { listTranslatedData.insert(strKey,hashRecord); } } return listTranslatedData; } /// /// 根据父表的键值获取对应子表的数据 /// template static QList ChildrenDataByParent(QList> listParent,QList t,QList> filter) { QList listFilterData; bool bFlag = true; QList> listFilter; listFilter = listParent; listFilter.append(filter); foreach (T* item,t) { bFlag = Filter(item,listFilter); if (bFlag) { //有对应的记录 listFilterData.append(item); } } return listFilterData; } template static QMap> ChildrenDataByParent(QList listParentValue,QString subKey, QList t, QList> filter) { QMap> mapSubData; QList> listKeyValues; QPair pairKeyValue; for(int i=0;i listSubTableData = ChildrenDataByParent(listKeyValues, t, filter); mapSubData.insert(i, listSubTableData); } return mapSubData; } template static QMap> ChildrenDataByParent(QList> listParentValue, QList subKey, QList t, QList> filter) { QMap> mapSubData; QList> listKeyValues; QPair pairKeyValue; for(int i=0;i listSubTableData = ChildrenDataByParent(listKeyValues, t, filter); mapSubData.insert(i, listSubTableData); } return mapSubData; } /// /// 根据父表的键值获取对应子表的数据 /// template static int GetRecordNum(QList t,QPair key) { int iCount = 0; if (key.first == "") { return t.count(); } foreach (T* item,t) { int index = item->metaObject()->indexOfProperty(key.first.toStdString().c_str()); if (index >=0) { QMetaProperty metaProp = item->metaObject()->property(index); QString strValue = metaProp.read(item).toString(); if ((strValue == key.second)) { iCount++; } } } return iCount; } static QString GetFormatName(int num,int digital) { QString format= "%0"+QString::number(digital)+"d"; #if(QT_VERSION_MAJOR == 6) QString strFormat = QString::number(num).asprintf(format.toStdString().c_str(), num); //考虑QMap中的排序的问题 return strFormat; #else QString strFormat = QString::number(num).sprintf(format.toStdString().c_str(), num); //考虑QMap中的排序的问题 return strFormat; #endif } template static bool BelongRecord(T* item,QPair key) { QString strMatchValue ; if (key.first != "") { int iMatchindex = item->metaObject()->indexOfProperty(key.first.toStdString().c_str()); if (iMatchindex >=0) { QMetaProperty metaProp = item->metaObject()->property(iMatchindex); strMatchValue = metaProp.read(item).toString(); if (!(strMatchValue == key.second)) { return false; } }else { return false; } } return true; } template static QList FilterDataT(QList t,QList> filter) { QList filteredTable; bool bRecord; if (filter.count() == 0) return t; foreach (T* item,t) { bRecord = Filter(item,filter); if (bRecord) { filteredTable.append(item); } } return filteredTable; } //template //static QList GetDataByFieldT(QList t,QString field,QList> filter) //{ // QList fieldValue; // bool bRecord; // foreach (T* item,t) { // bRecord = true; // foreach (QPair item1, filter) { // int index = item->metaObject()->indexOfProperty(item1.first.toStdString().c_str()); // if (index >=0) // { // QMetaProperty metaProp = item->metaObject()->property(index); // QString strMatchValue =metaProp.read(item).toString(); // if (strMatchValue != item1.second) // { // bRecord = false; // } // }else{bRecord = false;} // } // if (bRecord) // { // int index = item->metaObject()->indexOfProperty(field.toStdString().c_str()); // if (index >=0) // { // QMetaProperty metaProp = item->metaObject()->property(index); // QString strValue =metaProp.read(item).toString(); // fieldValue.append(strValue); // } // } // } // return fieldValue; //} template static QList GetDataByFieldT(QList t,QString field) { QList fieldValue; foreach (T* item,t) { QString strValue = GetValueByFieldT(item,field); fieldValue.append(strValue); } return fieldValue; } template static QString GetValueByFieldT(T* item,QString field) { QString fieldValue=""; int index = item->metaObject()->indexOfProperty(field.toStdString().c_str()); if (index >=0) { QMetaProperty metaProp = item->metaObject()->property(index); fieldValue =metaProp.read(item).toString(); } return fieldValue; } template static QList> GetDataByFieldT(QList t, QList fields) { QList> fieldValues; foreach(T * item, t) { QList listValues = GetValueByFieldT(item, fields); if (listValues.count() > 0) fieldValues.append(GetValueByFieldT(item, fields)); } return fieldValues; } template static QList GetValueByFieldT(T* item, QList fields) { QList listFieldValue; QList listIndex; for (auto o : fields) { int index = item->metaObject()->indexOfProperty(o.toStdString().c_str()); if (index <= 0) return listFieldValue; listIndex.append(index); } for (auto o : listIndex) { QMetaProperty metaProp = item->metaObject()->property(o); listFieldValue.append(metaProp.read(item).toString()); } return listFieldValue; } }; } #endif // CCSDATABIND_H