← Back to team overview

dhis2-users team mailing list archive

Re: Compulsory data element not seems to be working

 

Hi all,

Any chance we could get a DHIS2 developer to respond to these issues with
compulsory data elements?

As I understand then, it seems to be two issues:

1.) Attempting to add data elements as compulsory to *certain* data sets
seems to result in a crash related to a uniqueness constraint being
violated: "duplicate key value violates unique constraint
"dataelement_operand_unique_key" Detail: Key (dataelementid,
categoryoptioncomboid)=(1627, 1596) already exists"

2.) When a data element *can* be successfully added to a data set as
compulsory, it appears it is not checked at all in the data validation
within data entry for the data set.

Any help with either issue would be great.

Thanks,

- Jasper

On Fri, Oct 21, 2016 at 10:08 AM, Ibrahim Bayoh <ibrahim.bayoh@sl.
ehealthafrica.org> wrote:

> Hi Lars,
> Regarding the Compulsory data element feature, it's still not been fixed.
> We've tested on 2.22 and 2.23 with almost the result.
>
>
>    - From the 'Data Sets' screen in DHIS2
>    - Select a Data Set
>    - Right click it and then 'Edit Compulsory Data Elements'
>    - Attempt to add one of the Data Elements to the DataSet
>    - Hit 'Save'.
>
> The action fails, with a DHIS2 error screen asking you to go back, where
> the changes aren't saved.
>
> See log below.
>
>
>
>> From the 'Data Sets' screen in DHIS2, select a Data Set, click it and
>> then 'Edit Compulsory Data Elements'. Attempt to add one of these Data
>> Elements to the Data Set and hit 'Save'. The action fails, with a DHIS2
>> error screen asking you to go back, where the changes aren't saved.
>
>
>> This appears to happen on both our dev server (2.22) and staging (2.21),
>> for all data set and data element combinations.
>
>
>> See log output below:
>
> `* INFO 2016-10-19 12:54:54,425 'admin' update
>> org.hisp.dhis.dataset.DataSet, name: georgeTest, uid: vjAYdNmic8v
>> (AuditLogUtil.java [http-apr-8080-exec-7])
>
> * WARN 2016-10-19 12:54:54,429 SQL Error: 0, SQLState: 23505
>> (SqlExceptionHelper.java [http-apr-8080-exec-7])
>
> * ERROR 2016-10-19 12:54:54,429 ERROR: duplicate key value violates unique
>> constraint "dataelement_operand_unique_key"
>
> Detail: Key (dataelementid, categoryoptioncomboid)=(1627, 1596) already
>> exists. (SqlExceptionHelper.java [http-apr-8080-exec-7])
>
> at org.springframework.orm.hibernate4.HibernateTransactionManag
>> er.convertHibernateAccessException(HibernateTransactionManager.java:730)
>
> at org.springframework.orm.hibernate4.HibernateTransactionManag
>> er.doCommit(HibernateTransactionManager.java:592)
>
> at org.springframework.transaction.support.AbstractPlatformTran
>> sactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
>
> at org.springframework.transaction.support.AbstractPlatformTran
>> sactionManager.commit(AbstractPlatformTransactionManager.java:726)
>
> at org.springframework.transaction.interceptor.TransactionAspec
>> tSupport.commitTransactionAfterReturning(TransactionAspectSu
>> pport.java:521)
>
> at org.springframework.transaction.interceptor.TransactionAspec
>> tSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
>
> at org.springframework.transaction.interceptor.TransactionInter
>> ceptor.invoke(TransactionInterceptor.java:96)
>
> at org.springframework.aop.framework.ReflectiveMethodInvocation
>> .proceed(ReflectiveMethodInvocation.java:179)
>
> at org.springframework.aop.interceptor.ExposeInvocationIntercep
>> tor.invoke(ExposeInvocationInterceptor.java:92)
>
> at org.springframework.aop.framework.ReflectiveMethodInvocation
>> .proceed(ReflectiveMethodInvocation.java:179)
>
> at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(
>> JdkDynamicAopProxy.java:207)
>
> at com.sun.proxy.$Proxy99.updateDataSet(Unknown Source)
>
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce
>> ssorImpl.java:62)
>
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMe
>> thodAccessorImpl.java:43)
>
> at java.lang.reflect.Method.invoke(Method.java:498)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction
>> (DefaultActionInvocation.java:450)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction
>> Only(DefaultActionInvocation.java:289)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:252)
>
> at org.hisp.dhis.webportal.interceptor.XWorkPortalUserIntercept
>> or.intercept(XWorkPortalUserInterceptor.java:85)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.webportal.interceptor.XWorkPortalModuleInterce
>> ptor.intercept(XWorkPortalModuleInterceptor.java:91)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.webportal.interceptor.XWorkPortalMenuIntercept
>> or.intercept(XWorkPortalMenuInterceptor.java:94)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.webportal.interceptor.XWorkPortalParamsInterce
>> ptor.intercept(XWorkPortalParamsInterceptor.java:149)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.interceptor.ContextInterceptor.intercept(Conte
>> xtInterceptor.java:83)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.interceptor.UserSettingInterceptor.intercept(U
>> serSettingInterceptor.java:81)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.security.intercept.LoginInterceptor.intercept(
>> LoginInterceptor.java:85)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.security.intercept.XWorkSecurityInterceptor.in
>> tercept(XWorkSecurityInterceptor.java:116)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.interceptor.SystemSettingInterceptor.intercept
>> (SystemSettingInterceptor.java:115)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.interceptor.I18nInterceptor.intercept(I18nInte
>> rceptor.java:139)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at com.opensymphony.xwork2.interceptor.ParametersInterceptor.do
>> Intercept(ParametersInterceptor.java:254)
>
> at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.
>> intercept(MethodFilterInterceptor.java:98)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at com.opensymphony.xwork2.interceptor.StaticParametersIntercep
>> tor.intercept(StaticParametersInterceptor.java:191)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.hisp.dhis.interceptor.ExceptionInterceptor.intercept(Exc
>> eptionInterceptor.java:113)
>
> at com.opensymphony.xwork2.DefaultActionInvocation.invoke(Defau
>> ltActionInvocation.java:246)
>
> at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActi
>> onProxy.java:54)
>
> at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispa
>> tcher.java:562)
>
> at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAc
>> tion(ExecuteOperations.java:77)
>
> at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExec
>> uteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
>
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi
>> lter(ApplicationFilterChain.java:241)
>
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App
>> licationFilterChain.java:208)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:330)
>
> at org.springframework.security.web.access.intercept.FilterSecu
>> rityInterceptor.invoke(FilterSecurityInterceptor.java:118)
>
> at org.springframework.security.web.access.intercept.FilterSecu
>> rityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.access.ExceptionTranslation
>> Filter.doFilter(ExceptionTranslationFilter.java:113)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.session.SessionManagementFi
>> lter.doFilter(SessionManagementFilter.java:103)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.authentication.AnonymousAut
>> henticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.servletapi.SecurityContextH
>> olderAwareRequestFilter.doFilter(SecurityContextHolderAwareR
>> equestFilter.java:154)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.savedrequest.RequestCacheAw
>> areFilter.doFilter(RequestCacheAwareFilter.java:45)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.authentication.www.BasicAut
>> henticationFilter.doFilter(BasicAuthenticationFilter.java:150)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.hisp.dhis.security.filter.CorsFilter.doFilter(CorsFilter.java:123)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.authentication.AbstractAuth
>> enticationProcessingFilter.doFilter(AbstractAuthenticationPr
>> ocessingFilter.java:199)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.authentication.AbstractAuth
>> enticationProcessingFilter.doFilter(AbstractAuthenticationPr
>> ocessingFilter.java:199)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.hisp.dhis.security.filter.CustomAuthenticationFilter.doF
>> ilter(CustomAuthenticationFilter.java:64)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.oauth2.provider.authentication.
>> OAuth2AuthenticationProcessingFilter.doFilter(OAuth2Authenti
>> cationProcessingFilter.java:140)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.authentication.logout.Logou
>> tFilter.doFilter(LogoutFilter.java:110)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.hisp.dhis.security.filter.AutomaticAccessFilter.doFilter
>> (AutomaticAccessFilter.java:115)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.header.HeaderWriterFilter.d
>> oFilterInternal(HeaderWriterFilter.java:57)
>
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
>> (OncePerRequestFilter.java:107)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.context.request.async.WebAs
>> yncManagerIntegrationFilter.doFilterInternal(WebAsyncManager
>> IntegrationFilter.java:50)
>
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
>> (OncePerRequestFilter.java:107)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.context.SecurityContextPers
>> istenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
>
> at org.springframework.security.web.FilterChainProxy$VirtualFil
>> terChain.doFilter(FilterChainProxy.java:342)
>
> at org.springframework.security.web.FilterChainProxy.doFilterIn
>> ternal(FilterChainProxy.java:192)
>
> at org.springframework.security.web.FilterChainProxy.doFilter(F
>> ilterChainProxy.java:160)
>
> at org.springframework.web.filter.DelegatingFilterProxy.invokeD
>> elegate(DelegatingFilterProxy.java:344)
>
> at org.springframework.web.filter.DelegatingFilterProxy.doFilte
>> r(DelegatingFilterProxy.java:261)
>
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi
>> lter(ApplicationFilterChain.java:241)
>
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App
>> licationFilterChain.java:208)
>
> at org.springframework.orm.hibernate4.support.OpenSessionInView
>> Filter.doFilterInternal(OpenSessionInViewFilter.java:151)
>
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
>> (OncePerRequestFilter.java:107)
>
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi
>> lter(ApplicationFilterChain.java:241)
>
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App
>> licationFilterChain.java:208)
>
> at org.springframework.web.filter.CharacterEncodingFilter.doFil
>> terInternal(CharacterEncodingFilter.java:85)
>
> at org.springframework.web.filter.OncePerRequestFilter.doFilter
>> (OncePerRequestFilter.java:107)
>
> at org.apache.catalina.core.ApplicationFilterChain.internalDoFi
>> lter(ApplicationFilterChain.java:241)
>
> at org.apache.catalina.core.ApplicationFilterChain.doFilter(App
>> licationFilterChain.java:208)
>
> at org.apache.catalina.core.StandardWrapperValve.invoke(Standar
>> dWrapperValve.java:218)
>
> at org.apache.catalina.core.StandardContextValve.invoke(Standar
>> dContextValve.java:122)
>
> at org.apache.catalina.authenticator.AuthenticatorBase.invoke(A
>> uthenticatorBase.java:505)
>
> at org.apache.catalina.core.StandardHostValve.invoke(StandardHo
>> stValve.java:169)
>
> at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorRepo
>> rtValve.java:103)
>
> at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogVa
>> lve.java:956)
>
> at org.apache.catalina.core.StandardEngineValve.invoke(Standard
>> EngineValve.java:116)
>
> at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAd
>> apter.java:442)
>
> at org.apache.coyote.http11.AbstractHttp11Processor.process(Abs
>> tractHttp11Processor.java:1083)
>
> at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler
>> .process(AbstractProtocol.java:640)
>
> at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProc
>> essor.run(AprEndpoint.java:2454)
>
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPool
>> Executor.java:1142)
>
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoo
>> lExecutor.java:617)
>
> at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.r
>> un(TaskThread.java:61)
>
> at java.lang.Thread.run(Thread.java:745)
>
> Caused by: org.hibernate.exception.ConstraintViolationException: could
>> not execute statement
>
> at org.hibernate.exception.internal.SQLStateConversionDelegate.
>> convert(SQLStateConversionDelegate.java:129)
>
> at org.hibernate.exception.internal.StandardSQLExceptionConvert
>> er.convert(StandardSQLExceptionConverter.java:49)
>
> at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(Sql
>> ExceptionHelper.java:124)
>
> at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(Sql
>> ExceptionHelper.java:109)
>
> at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.execu
>> teUpdate(ResultSetReturnImpl.java:189)
>
> at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.ad
>> dToBatch(NonBatchingBatch.java:59)
>
> at org.hibernate.persister.entity.AbstractEntityPersister.inser
>> t(AbstractEntityPersister.java:3079)
>
> at org.hibernate.persister.entity.AbstractEntityPersister.inser
>> t(AbstractEntityPersister.java:3521)
>
> at org.hibernate.action.internal.EntityInsertAction.execute(Ent
>> ityInsertAction.java:88)
>
> at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:395)
>
> at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQu
>> eue.java:387)
>
> at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQu
>> eue.java:303)
>
> at org.hibernate.event.internal.AbstractFlushingEventListener.p
>> erformExecutions(AbstractFlushingEventListener.java:349)
>
> at org.hibernate.event.internal.DefaultFlushEventListener.onFlu
>> sh(DefaultFlushEventListener.java:56)
>
> at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1195)
>
> at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:404)
>
> at org.hibernate.engine.transaction.internal.jdbc.JdbcTransacti
>> on.beforeTransactionCommit(JdbcTransaction.java:101)
>
> at org.hibernate.engine.transaction.spi.AbstractTransactionImpl
>> .commit(AbstractTransactionImpl.java:175)
>
> at org.springframework.orm.hibernate4.HibernateTransactionManag
>> er.doCommit(HibernateTransactionManager.java:584)
>
> ... 118 more
>
> Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value
>> violates unique constraint "dataelement_operand_unique_key"
>
> Detail: Key (dataelementid, categoryoptioncomboid)=(1627, 1596) already
>> exists.
>
> at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorRespons
>> e(QueryExecutorImpl.java:2198)
>
> at org.postgresql.core.v3.QueryExecutorImpl.processResults(Quer
>> yExecutorImpl.java:1927)
>
> at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecut
>> orImpl.java:255)
>
> at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(Abstract
>> Jdbc2Statement.java:561)
>
> at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags
>> (AbstractJdbc2Statement.java:419)
>
> at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(Ab
>> stractJdbc2Statement.java:365)
>
> at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUp
>> date(NewProxyPreparedStatement.java:105)
>
> at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.execu
>> teUpdate(ResultSetReturnImpl.java:186)
>
> ... 132
>
> more
>
> at
>
> org.hisp.dhis.dataset.action.compulsory.SaveCompulsoryDataEl
>> ementsAction.execute(SaveCompulsoryDataElementsAction.java:113)
>
> * ERROR 2016-10-19 12:54:54,433 Error while executing action
>> (ExceptionInterceptor.java [http-apr-8080-exec-7])
>
> org.springframework.dao.DataIntegrityViolationException: could not
>> execute statement; SQL [n/a]; constraint [dataelement_operand_unique_key];
>> nested exception is org.hibernate.exception.ConstraintViolationException:
>> could not execute
>
> statement
>
> at
>
> org.springframework.orm.hibernate4.SessionFactoryUtils.conve
> rtHibernateAccessException(SessionFactoryUtils.java:163)`
>
> Thanks,
> Bayoh.
>
>
>
>
>
>
>
>
>>
>
>
>
> On Fri, Jun 24, 2016 at 12:45 PM, Lars Helge Øverland <lars@xxxxxxxxx>
> wrote:
>
>> Hi Ibra,
>>
>> thanks for reporting. Yes we are in fact aware of this one and working on
>> it now. Should be fixed soon.
>>
>> regards,
>>
>> Lars
>>
>> On Fri, Jun 24, 2016 at 2:00 PM, Ibrahim Bayoh <
>> ibrahim.bayoh@xxxxxxxxxxxxxxxxxxxx> wrote:
>>
>>> Hi All,
>>> Am try to set certain data element as compulsory or mandatory in data
>>> set but some reason the assigned compulsory data element does not seem to
>>> have any effect on the data sets or forms. Forms or data sets can be
>>> completed even though they contain compulsory data element. Is this a bug
>>> or a my doing something wrong? My steps below.
>>>
>>> *From Data set App*
>>>
>>>    1. Select Data sets
>>>    2. Left click on the desired Data set
>>>    3. Select "Edit Compulsory Data Element" from the dropdown
>>>    4. From the list of data element double on the desired data element
>>>    5. then click save
>>>
>>>
>>> *From the Date entry App*
>>>
>>>    1. Select the data set/form you added the compulsory data element
>>>    2. Field other fields in the form except the compulsory data element
>>>    3. then click on "Complete"
>>>
>>>
>>> Idealy the form should not be completed or submitted if the compulsory
>>> data element is not filled, but in my case the form / data set completes
>>> even though the compulsory data element was neglected.
>>>
>>> Thanks,
>>> Bayoh.
>>> --
>>> Ibrahim Rashid Bayoh
>>> Information Systems Coordinator,
>>> eHealth Africa(Sierra Leone)
>>> *117 Wilkinson Rd, Freetown, Sierra Leone*
>>> Mobile: +232 88-765-638
>>> ibrahim.bayoh@xxxxxxxxxxxxxxxxxxxx
>>> http://ehealthafrica.org/
>>>
>>>
>>> _______________________________________________
>>> Mailing list: https://launchpad.net/~dhis2-users
>>> Post to     : dhis2-users@xxxxxxxxxxxxxxxxxxx
>>> Unsubscribe : https://launchpad.net/~dhis2-users
>>> More help   : https://help.launchpad.net/ListHelp
>>>
>>>
>>
>>
>> --
>> Lars Helge Øverland
>> Lead developer, DHIS 2
>> University of Oslo
>> Skype: larshelgeoverland
>> lars@xxxxxxxxx
>> http://www.dhis2.org <https://www.dhis2.org/>
>>
>>
>
>
> --
> *Ibrahim Rashid Bayoh*
> *Software Developer,*
> *eHealth Africa(Sierra Leone)*
>
> *Mobile: +232 88-765-638*
> *117 Wilkinson Rd, Freetown, Sierra Leone*
>
> ibrahim.bayoh@xxxxxxxxxxxxxxxxxxxx
> http://ehealthafrica.org/
>
>

Follow ups

References