ereport 图表打印空白

时间: 2023-11-21 22:03:17 浏览: 19
当eReport图表打印为空白的时候,一般原因可能包括以下几点: 1. 数据源错误:首先需要检查一下数据源是否正确,确保eReport能够正确获取到图表所需的数据。可以检查一下数据库连接是否正常,数据表是否存在并包含了正确的数据。 2. 模板设置错误:检查一下eReport的图表模板设置是否正确。确保图表所需的字段和数据类型与模板中的设置相匹配。比如,检查一下图表字段绑定是否正确、数据显示格式是否正确等。 3. 图表样式设置错误:如果图表样式设置错误,也有可能导致打印时出现空白。可以检查一下图表的颜色、字体、线条等样式设置是否正确。 4. 打印参数设置错误:在打印时,可能需要设置一些参数来控制图表的显示。可以检查一下打印参数设置是否正确,比如图表的大小、位置、边距等。 如果以上几点都没有问题,还可以尝试以下方案: 1. 重新生成数据:尝试重新生成数据并刷新图表。有时候数据更新不及时或者出现错误,可能会导致图表显示为空白。 2. 尝试其他打印方式:如果在某个特定的打印方式下出现空白,可以尝试其他的打印方式,比如将图表导出为图片再进行打印。 3. 升级eReport版本:如果使用的是较旧的eReport版本,可能会存在一些bug或者兼容性问题。可以尝试升级到最新的版本来解决问题。 如果以上方法都无法解决问题,建议联系eReport的技术支持团队寻求进一步帮助。
相关问题

hashjoin源码 sortmergejoin源码

这里提供 PostgreSQL 数据库中 hash join 和 sort merge join 实现的相关源码,仅供参考: Hash Join 实现源码: ```c /* * ExecHashJoin * Implements the hashjoin algorithm. * * Returns the join relation. * * Parallel version: we distribute the outer relation into a number of * partitions with a hash function, and process each partition * independently of the others. The inner relation is replicated to * all workers, so that each can perform the join independently. * This works best if the inner relation is smaller than the outer. */ static TupleTableSlot * ExecHashJoin(PlanState *pstate) { HashJoinState *node = castNode(HashJoinState, pstate); ExprContext *econtext = node->js.ps.ps_ExprContext; TupleTableSlot *slot; CHECK_FOR_INTERRUPTS(); /* * If we're still building the hash table, do that, else fetch the current * batch of outer tuples to probe the existing hash table. */ if (!node->hj_JoinState) ExecBuildHashTable(node); else node->hj_OuterTupleSlot = ExecProcNode(outerPlanState(node)); /* * Now loop, returning join tuples as we find them. */ for (;;) { CHECK_FOR_INTERRUPTS(); /* * If we don't have an outer tuple, get the next one and reset our * state machine for new tuple. */ if (TupIsNull(node->hj_OuterTupleSlot)) { if (!ExecScanHashTableForUnmatched(node)) { /* no more unmatched tuples */ return NULL; } /* Found unmatched outer, so compute its hash value */ ResetExprContext(econtext); econtext->ecxt_outertuple = node->hj_OuterTupleSlot; node->hj_CurHashValue = ExecHashGetHashValue(node->hj_HashTable, econtext, node->hj_OuterHashKeys); node->hj_JoinState = HJ_NEED_NEW_OUTER; /* * Now we have an outer tuple and its hash value. */ } /* inner loop over all matching inner tuples */ while (node->hj_JoinState != HJ_NEED_NEW_OUTER) { /* Fetch next tuple from inner side */ slot = ExecScanHashTable(node); /* if there are no more inner tuples... */ if (TupIsNull(slot)) { node->hj_JoinState = HJ_NEED_NEW_OUTER; break; /* ... out of inner loop */ } /* we have a new join tuple, return it */ econtext->ecxt_innertuple = slot; return ExecProject(node->js.ps.ps_ProjInfo); } } } ``` Sort Merge Join 实现源码: ```c /* * ExecSortMergeJoin * Implements the sort/merge join algorithm. * * Returns the join relation. * * Parallel version: we distribute the outer relation into a number of * partitions with a hash function, and sort the inner relation on the * join key. We then perform the join independently for each partition, * with each worker performing the merge join of its partition with the * sorted inner relation. */ static TupleTableSlot * ExecSortMergeJoin(PlanState *pstate) { SortMergeJoinState *node = castNode(SortMergeJoinState, pstate); ExprContext *econtext = node->js.ps.ps_ExprContext; TupleTableSlot *slot; CHECK_FOR_INTERRUPTS(); /* First call? */ if (node->smj_JoinState == SMJ_STARTUP) { PlanState *outerNode; PlanState *innerNode; List *inInfo; ListCell *l; List *outInfo; AttrNumber *match; int nMatch; /* * We need to do some initialization for outer and inner nodes. Also, * we figure out which join keys are being used, and build equality * operators for them. */ outerNode = outerPlanState(node); innerNode = innerPlanState(node); inInfo = innerNode->plan->targetlist; outInfo = outerNode->plan->targetlist; nMatch = 0; match = palloc(list_length(node->smj_MergingClauses) * sizeof(AttrNumber)); foreach(l, node->smj_MergingClauses) { OpExpr *clause = (OpExpr *) lfirst(l); Var *innerVar; Var *outerVar; Oid eqop; /* * Currently, only "simple" cross-type comparisons work. See * comments in src/backend/utils/adt/genfile.c. */ if (!is_simple_eq_op(clause->opno)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("mergejoin operator must be a btree equality operator"))); innerVar = (Var *) get_leftop((Expr *) clause); outerVar = (Var *) get_rightop((Expr *) clause); /* We don't need to output these columns in the result */ innerVar->varno = INNER_VAR; outerVar->varno = OUTER_VAR; /* * We may have to look up the operator___ in the opfamily to check that * it is compatible with sorting. */ eqop = get_opfamily_member(clause->opfamily, innerVar->vartype, outerVar->vartype, BTEqualStrategyNumber); if (eqop == InvalidOid) elog(ERROR, "no operator___ matching clause"); match[nMatch] = outInfo ? ExecFindMatchingJoinVar(outerVar, outInfo) : ExecFindMatchingJoinVar(innerVar, inInfo); nMatch++; } node->js.ps.ps_ExprContext->ecxt_per_tuple_memory = node->smj_RuntimeContext; ExecAssignExprContext(node->js.ps.ps_ExprContext, outerNode->parent); /* * Initialize tuplesort state variables used in merging phase, and in * state where we're reading inner relation. */ node->smj_OuterSkipQual = ExecInitQual(node->js.ps.qual, outerNode); node->smj_InnerSkipQual = ExecInitQual(node->js.ps.qual, innerNode); node->smj_MatchedOuter = false; node->smj_MatchedInner = false; node->smj_OuterTupleSlot = ExecProcNode(outerNode); if (TupIsNull(node->smj_OuterTupleSlot)) { /* empty outer relation */ node->smj_JoinState = SMJ_NEEDS_INNER; return NULL; } node->smj_SortKeys = ExecBuildSortKey(node, inInfo, outInfo, match, nMatch); /* can't handle non-heap tuplesort methods here */ if (!node->smj_SortKeys->abbrev_converter && node->smj_PresortedKeys == NIL) node->smj_SortStates[0] = tuplesort_begin_merge(node->smj_SortKeys->sortFunction, node->smj_WorkMem, node->ssps_TempFileSpaces, node->smj_SortKeys->abbrev_full_comparator, node); else node->smj_SortStates[0] = tuplesort_begin_datum(node->smj_SortKeys->sortFunction, node->smj_SortKeys->abbrev_converter, node->smj_SortKeys->abbrev_full_comparator, node->smj_WorkMem, node->ssps_TempFileSpaces, node); /* * Begin scanning the inner relation. We'll read tuples in sorted * order, so the main loop will be able to use a simple and fast * algorithm for advancing the outer relation and resetting the inner * scan. */ node->smj_JoinState = SMJ_NEEDS_INNER; node->smj_MatchedOuter = false; node->smj_MatchedInner = false; /* * Set up tuplestore and materialize the inner relation. We only need to * materialize the inner relation if we are in a parallel plan. */ if (node->js.ps.plan->parallel_aware) { Assert(node->js.ps.ps_ExecProcNode == ExecSortMergeJoin); node->smj_InnerTupleSlot = outerNode->ps_ResultTupleSlot; /* * If we are in a parallel plan, and if the inner side of this join * was not fully gathered (because it was too large), then we must * materialize the inner tuples before proceeding with the join. */ if (outerNode->ps_Flow->flotype == FLOW_REPLICATE && innerNode->ps_Flow->flotype == FLOW_PARTITIONED && !innerNode->ps_Flow->initialized) { Assert(innerNode->ps_ResultTupleSlot->tts_tupleDescriptor != NULL); /* Create tuplestore to store the entire inner relation. */ node->ss.ps.ps_TupFromTlist = false; node->ss.ps.ps_ProjInfo = NULL; node->ss.ps.ps_ExprContext = node->js.ps.ps_ExprContext; node->ss.ps.ps_TupSlot = tuplestore_begin_heap(false, false, work_mem); node->ss.ps.ps_ResultTupleSlot = node->smj_InnerTupleSlot; node->ss.ps.ps_ProjInfo = NULL; /* Materialize all inner tuples. */ while (!TupIsNull(slot = ExecProcNode(innerNode))) { tuplestore_puttupleslot(node->ss.ps.ps_TupSlot, slot); } /* Seek back to start of the materialized inner relation. */ tuplestore_rescan(node->ss.ps.ps_TupSlot); } else { /* * If the inner side is fully gathered (i.e., if it is a * shared-nothing table), then we can simply use the existing * outer slot as the inner slot as well. */ node->smj_InnerTupleSlot = node->smj_OuterTupleSlot; } } else { node->smj_InnerTupleSlot = ExecProcNode(innerNode); /* if empty inner relation, advance to next outer tuple */ if (TupIsNull(node->smj_InnerTupleSlot)) node->smj_JoinState = SMJ_NEEDS_OUTER; } } /* * The main loop advances the outer scan, possibly reinitializing the * inner scan, and checks for matches between outer tuples and inner * tuples. */ for (;;) { CHECK_FOR_INTERRUPTS(); switch (node->smj_JoinState) { case SMJ_NEEDS_INNER: /* Reset the inner scan. */ if (node->js.ps.plan->parallel_aware) { /* * If we are in a parallel plan, and if the inner side of * this join was not fully gathered (because it was too * large), then we must read from the materialized inner * relation that was created earlier. We have to switch to * the other worker's partition if we've reached the end of * our own. Otherwise, we can simply rescan the materialized * inner relation. */ if (outerPlanState(node)->ps_Flow->flotype == FLOW_REPLICATE && innerPlanState(node)->ps_Flow->flotype == FLOW_PARTITIONED && !innerPlanState(node)->ps_Flow->initialized) { if (node->ss.ps.ps_TupSlot && !tuplestore_gettupleslot(node->ss.ps.ps_TupSlot, true, false, node->smj_InnerTupleSlot)) { /* * We've reached the end of our own partition, but * there may be more partitions. Advance to the * next partition by updating our slice table entry * and resetting the tuplestore so that we can read * from the new partition. If there are no more * partitions, we're done. */ if (!ExecParallelUpdatePartitionInfo(node, true)) { node->smj_JoinState = SMJ_NEEDS_OUTER; break; } tuplestore_clear(node->ss.ps.ps_TupSlot); tuplestore_rescan(node->ss.ps.ps_TupSlot); continue; } } else { /* * If the inner side is fully gathered (i.e., if it is * a shared-nothing table), then we can simply rescan * the existing outer slot as the inner slot as well. */ ExecClearTuple(node->smj_InnerTupleSlot); tuplestore_rescan(node->ss.ps.ps_TupSlot); } } else { /* advance inner scan */ ExecClearTuple(node->smj_InnerTupleSlot); node->smj_InnerTupleSlot = ExecProcNode(innerPlanState(node)); } if (TupIsNull(node->smj_InnerTupleSlot)) { /* end of inner scan */ node->smj_JoinState = SMJ_NEEDS_OUTER; break; } /* * We know the new inner tuple is not distinct from the last one * returned, so we update matched_inner accordingly. */ node->smj_MatchedInner = true; /* * Set up the state for matching tuples. */ ResetExprContext(econtext); econtext->ecxt_innertuple = node->smj_InnerTupleSlot; econtext->ecxt_outertuple = node->smj_OuterTupleSlot; /* Skip non-matching tuples based on previously established * skip qual */ if (node->smj_InnerSkipQual) { ExprState *qualexpr = node->smj_InnerSkipQual; if (!ExecQual(qualexpr, econtext)) { /* not matched */ continue; } } /* * Now we check the merge condition(s). */ if (ExecQualAndReset(node->smj_MergeClauses, econtext)) { /* matched */ node->smj_JoinState = SMJ_JOINEDMATCHING; return ExecProject(node->js.ps.ps_ProjInfo); } /* * Not joined, so try next tuple from inner side. */ break; case SMJ_JOINEDMATCHING: case SMJ_JOINEDNONMATCHING: /* Try to advance inner-side tuple */ ExecClearTuple(node->smj_InnerTupleSlot); node->smj_InnerTupleSlot = ExecProcNode(innerPlanState(node)); if (TupIsNull(node->smj_InnerTupleSlot)) { /* end of inner scan */ if (node->smj_JoinState == SMJ_JOINEDMATCHING) { node->smj_JoinState = SMJ_NEEDS_INNER; node->smj_MatchedInner = false; /* try to fetch next outer tuple */ ExecClearTuple(node->smj_OuterTupleSlot); node->smj_OuterTupleSlot = ExecProcNode(outerPlanState(node)); if (TupIsNull(node->smj_OuterTupleSlot)) { /* end of outer scan */ node->smj_JoinState = SMJ_NEEDS_INNER; break; } } else { node->smj_JoinState = SMJ_NEEDS_OUTER; break; } } node->smj_MatchedInner = false; /* * Set up the state for matching tuples. */ ResetExprContext(econtext); econtext->ecxt_innertuple = node->smj_InnerTupleSlot; econtext->ecxt_outertuple = node->smj_OuterTupleSlot; /* Skip non-matching tuples based on previously established * skip qual */ if (node->smj_InnerSkipQual) { ExprState *qualexpr = node->smj_InnerSkipQual; if (!ExecQual(qualexpr, econtext)) { /* not matched */ continue; } } /* * Now we check the merge condition(s). */ if (ExecQualAndReset(node->smj_MergeClauses, econtext)) { /* matched */ node->smj_MatchedInner = true; node->smj_JoinState = SMJ_JOINEDMATCHING; return ExecProject(node->js.ps.ps_ProjInfo); } /* * Not joined, so try again with next tuple from inner side. */ break; case SMJ_NEEDS_OUTER: /* Try to advance outer-side tuple */ ExecClearTuple(node->smj_OuterTupleSlot); node->smj_OuterTupleSlot = ExecProcNode(outerPlanState(node)); if (TupIsNull(node->smj_OuterTupleSlot)) { /* end of outer scan */ node->smj_JoinState = SMJ_NEEDS_INNER; break; } /* * New outer tuple; try to match it to first inner tuple. */ node->smj_JoinState = SMJ_FIRST_INNER; /* FALL THRU */ case SMJ_FIRST_INNER: /* * We know the new outer tuple is not distinct from the last one * returned, so we update matched_outer accordingly. */ node->smj_MatchedOuter = true; /* * Set up the state for matching tuples. */ ResetExprContext(econtext); econtext->ecxt_innertuple = node->smj_InnerTupleSlot; econtext->ecxt_outertuple = node->smj_OuterTupleSlot; /* Skip non-matching tuples based on previously established * skip qual */ if (node->smj_OuterSkipQual) { ExprState *qualexpr = node->smj_OuterSkipQual; if (!ExecQual(qualexpr, econtext)) { /* not

相关推荐

最新推荐

recommend-type

五子棋wuziq.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

单片机C语言Proteus仿真实例占空比可调模拟仿真程序

单片机C语言Proteus仿真实例占空比可调模拟仿真程序提取方式是百度网盘分享地址
recommend-type

单片机C语言Proteus仿真实例用数码管设计的可调式电子钟

单片机C语言Proteus仿真实例用数码管设计的可调式电子钟提取方式是百度网盘分享地址
recommend-type

2023年第16届中国大学生计算机设计大赛附往届获奖作品合集资料

2023年第16届中国大学生计算机设计大赛附往届获奖作品合集资料提取方式是百度网盘分享地址
recommend-type

Linux下,C语言实现五子棋程序Linux-Wuziqi.zip

五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。